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

inotify擴展介紹

inotify是Linux內核提供的一組系統調用,它能夠監控文件系統操做,好比文件或者目錄的建立、讀取、寫入、權限修改和刪除等。
php

inotify使用也很簡單,使用inotify_init建立一個句柄,而後經過inotify_add_watch/inotify_rm_watch增長/刪除對文件和目錄的監聽。shell

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

安裝inotify/swoole擴展

若是已經安裝了inotify/swoole能夠跳過此步驟。cookie

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獲取事件。沒有事件發生時,程序能夠執行其餘的邏輯。spa

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

相關文章
相關標籤/搜索