inotify是Linux內核提供的一組系統調用,它能夠監控文件系統操做,好比文件或者目錄的建立、讀取、寫入、權限修改和刪除等。
php
inotify使用也很簡單,使用inotify_init建立一個句柄,而後經過inotify_add_watch/inotify_rm_watch增長/刪除對文件和目錄的監聽。shell
PHP中提供了inotify擴展,支持了inotify系統調用。inotify自己也是一個文件描述符,能夠加入到事件循環中,配合使用swoole擴展,就能夠異步非阻塞地實時監聽文件/目錄變化。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.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' => '', )
//建立一個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
關於inotify更多的信息能夠到PHP官方網站中查看 http://php.net/inotify
關於swoole更多信息,請到swoole官方網站取了解 http://www.swoole.com/