php使用inotify實現隊列處理

php使用inotify實現隊列處理
參考以下文章:
http://blog.jiunile.com/php%E4%BD%BF%E7%94%A8inotify%E5%AE%9E%E7%8E%B0%E9%98%9F%E5%88%97%E5%A4%84%E7%90%86.html
http://sexywp.com/use-inotify-to-monitor-file-system.htm
上面的我已經測試,確實是正確的。

php

首先,咱們須要達成如下一些共識:html

  • /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),解壓並安裝:linux

1
2
3
4
5
tar -xvf inotify-0.1.6.tgz
cd inotify-0.1.6
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config
make && make install

接着在php.ini文件中加載inotify.so,查看有沒有加載成功可經過php -i|grep inotify查看。web

接着在/dev/shm創建內存目錄,由於隊列的處理是須要較高的速度,放到磁盤會有必定的I/O時間消耗,咱們創建/dev/shm/inotify目錄,而後用php寫一個死循環的demo去監控目錄,另外,經過變動/dev/shm/inotify目錄的文件或屬性查看結果:數組

01
02
03
04
05
06
07
08
09
10
11
12
<?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就不存在有沒有操做都須要循環執行。cookie

嘗試在/dev/shm/inotify創建一個test.txt的新文件,會在inotify_read返回一個包含全部文件的數組,如:ide

01
02
03
04
05
06
07
08
09
10
Array
(
     [0] => Array
         (
             [wd] => 1
             [mask] => 256
             [cookie] => 0
             [name] => test.txt
         )
)
相關文章
相關標籤/搜索