swoole+inotify實現異步實時文件監控
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操作。
-
關于inotify更多的信息可以到PHP官方網站中查看 http://php.net/inotify
-
關于swoole更多信息,請到swoole官方網站取了解 http://www.swoole.com/
來自:http://my.oschina.net/matyhtf/blog/343508