程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php使用inotify實現隊列處理

php使用inotify實現隊列處理

編輯:PHP綜合

首先,我們需要了解一些知識:

/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
        )
)
*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved