swoole+inotify實現(xiàn)異步實時文件監(jiān)控
inotify擴(kuò)展介紹
inotify是Linux內(nèi)核提供的一組系統(tǒng)調(diào)用,它可以監(jiān)控文件系統(tǒng)操作,比如文件或者目錄的創(chuàng)建、讀取、寫入、權(quán)限修改和刪除等。
inotify使用也很簡單,使用inotify_init創(chuàng)建一個句柄,然后通過inotify_add_watch/inotify_rm_watch增加/刪除對文件和目錄的監(jiān)聽。
PHP中提供了inotify擴(kuò)展,支持了inotify系統(tǒng)調(diào)用。inotify本身也是一個文件描述符,可以加入到事件循環(huán)中,配合使用swoole擴(kuò)展,就可以異步非阻塞地實時監(jiān)聽文件/目錄變化。
安裝inotify/swoole擴(kuò)展
如果已經(jīng)安裝了inotify/swoole可以跳過此步驟。
peclinstallswoolepeclinstallinotify
操作成功后,修改php.ini,加入
extension=swoole.soextension=inotify.so
查看擴(kuò)展是否加載成功:
php -m|grepswoolephp -m|grepinotify
inotify的使用
首先在當(dāng)前目錄創(chuàng)建一個inotify.data文件,示例就用來監(jiān)聽此文件。
//創(chuàng)建一個inotify句柄$fd = inotify_init();//監(jiān)聽文件,僅監(jiān)聽修改操作,如果想要監(jiān)聽所有事件可以使用IN_ALL_EVENTS$watch_descriptor = inotify_add_watch($fd,__DIR__.'/inotify.data', IN_MODIFY);while(true) {//阻塞地讀取數(shù)據(jù)$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.datainotify Event :array('wd'=>1,'mask'=>2,'cookie'=>0,'name'=>'',)
swoole+inotify異步非阻塞監(jiān)聽文件
//創(chuàng)建一個inotify句柄$fd = inotify_init();//監(jiān)聽文件,僅監(jiān)聽修改操作,如果想要監(jiān)聽所有事件可以使用IN_ALL_EVENTS$watch_descriptor = inotify_add_watch($fd,__DIR__.'/inotify.data', IN_MODIFY);//加入到swoole的事件循環(huán)中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擴(kuò)展提供swoole_event_add函數(shù),將inotify句柄設(shè)置為非阻塞,并加入到epoll事件循環(huán)中。程序變成異步非阻塞模式。當(dāng)有事件發(fā)生時才會執(zhí)行inotify_read獲取事件。沒有事件發(fā)生時,程序可以執(zhí)行其他的邏輯。
此程序與上一個同步阻塞例子的邏輯是相同的,向inotify寫入內(nèi)容時也會打印事件信息。區(qū)別在于swoole+inotify的程序是異步的??梢灾С植l(fā)監(jiān)聽大量文件和目錄,并且除了inotify操作之外還可以執(zhí)行其他的IO操作。
關(guān)于inotify更多的信息可以到PHP官方網(wǎng)站中查看http://php.net/inotify
關(guān)于swoole更多信息,請到swoole官方網(wǎng)站取了解http://www.swoole.com/