swoole+inotify實現異步實時文件監控

jopen 11年前發布 | 22K 次閱讀 inotify Swoole

inotify擴展介紹

inotify是Linux內核提供的一組系統調用,它可以監控文件系統操作,比如文件或者目錄的創建、讀取、寫入、權限修改和刪除等。

inotify使用也很簡單,使用inotify_init創建一個句柄,然后通過inotify_add_watch/inotify_rm_watch增加/刪除對文件和目錄的監聽。

PHP中提供了inotify擴展,支持了inotify系統調用。inotify本身也是一個文件描述符,可以加入到事件循環中,配合使用swoole擴展,就可以異步非阻塞地實時監聽文件/目錄變化。

安裝inotify/swoole擴展

如果已經安裝了inotify/swoole可以跳過此步驟。

pecl install swoole
pecl install inotify

操作成功后,修改php.ini,加入

extension=swoole.so
extension=inotify.so

查看擴展是否加載成功:

php -m | grep swoole
php -m | grep inotify

inotify的使用

首先在當前目錄創建一個inotify.data文件,示例就用來監聽此文件。

//創建一個inotify句柄
$fd = inotify_init();

//監聽文件,僅監聽修改操作,如果想要監聽所有事件可以使用IN_ALL_EVENTS
$watch_descriptor = inotify_add_watch($fd, __DIR__.'/inotify.data', IN_MODIFY); 

while (true) {
    //阻塞地讀取數據
    $events = inotify_read($fd);
    if ($events) {
        foreach ($events as $event) {
            echo "inotify Event :".var_export($event, 1)."\n";
        }
    }
}

//釋放inotify句柄
inotify_rm_watch($fd, $watch_descriptor);
fclose($fd);

修改inotify.data,就可以看到程序輸出了信息。

echo "hello world" > inotify.data

inotify Event :array (
  'wd' => 1,
  'mask' => 2,
  'cookie' => 0,
  'name' => '',
)

swoole+inotify異步非阻塞監聽文件

//創建一個inotify句柄
$fd = inotify_init();

//監聽文件,僅監聽修改操作,如果想要監聽所有事件可以使用IN_ALL_EVENTS
$watch_descriptor = inotify_add_watch($fd, __DIR__.'/inotify.data', IN_MODIFY);

//加入到swoole的事件循環中
swoole_event_add($fd, function ($fd) {
    $events = inotify_read($fd);
    if ($events) {
        foreach ($events as $event) {
            echo "inotify Event :" . var_export($event, 1) . "\n";
        }
    }
});

這里使用了swoole擴展提供swoole_event_add函數,將inotify句柄設置為非阻塞,并加入到epoll事件循環中。程序變成異步非阻塞模式。當有事件發生時才會執行inotify_read獲取事件。沒有事件發生時,程序可以執行其他的邏輯。

此程序與上一個同步阻塞例子的邏輯是相同的,向inotify寫入內容時也會打印事件信息。區別在于swoole+inotify的程序是異步的。可以支持并發監聽大量文件和目錄,并且除了inotify操作之外還可以執行其他的IO操作。

 

 來自:http://my.oschina.net/matyhtf/blog/343508

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!