swoole+inotify實現(xiàn)異步實時文件監(jiān)控

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容