首先,我們需要了解一些知識:
/dev/shm 為linux下的內存目錄,顯然在這個目錄下建立的東西會放在內存中,默認可以使用50%的內存,在內存不足時,可通過swap進行切換到磁盤。
inotify是linux下的文件系統事件監控,可以滿足各種文件監控需要,提供了諸如inotify_init,inotify_read等接口,需要linux2.6或以上的內核(uname -a查看),cygwin下好像不能實現。
php默認是不提供支持inotify的擴展,所以我們需要通過pecl下載編譯安裝。
下載inotify (http://pecl.php.net/package/inotify),解壓並安裝:
tar -xvf inotify-0.1.6.tgz cd inotify-0.1.6 /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
接著在php.ini文件中加載inotify.so,查看有沒有加載成功可通過php -i|grep inotify查看。
接著在/dev/shm建立內存目錄,因為隊列的處理是需要較高的速度,放到磁盤會有一定的I/O時間消耗,我們建立/dev/shm /inotify目錄,然後用php寫一個死循環的demo去監控目錄,另外,通過變更/dev/shm/inotify目錄的文件或屬性查看結果:
<?php $notify = inotify_init(); $rs = inotify_add_watch($notify, '/dev/shm/inotify', IN_CREATE); //IN_CREATE表示只監控新文件的建立,具體參數列表可以在手冊inotify處找到。 if(!$rs){ die('fail to watch /dev/shm/inotify'); } while(1){ $files = inotify_read($notify); print_r($files); echo 'continue to process next event'; }
使用inotify模塊比不斷地循環和scan目錄要靈活且省資源,在inotify_read處,沒有收到任何事件之前是會一直阻塞的,所以這裡的while就不存在有沒有操作都需要循環執行。
嘗試在/dev/shm/inotify建立一個test.txt的新文件,會在inotify_read返回一個包含所有文件的數組,如:
Array ( [0] => Array ( [wd] => 1 [mask] => 256 [cookie] => 0 [name] => test.txt ) )*