博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swoole+inotify实现异步实时文件监控
阅读量:6406 次
发布时间:2019-06-23

本文共 1824 字,大约阅读时间需要 6 分钟。

hot3.png

inotify扩展介绍

inotify是Linux内核提供的一组系统调用,它可以监控文件系统操作,比如文件或者目录的创建、读取、写入、权限修改和删除等。

inotify使用也很简单,使用inotify_init创建一个句柄,然后通过inotify_add_watch/inotify_rm_watch增加/删除对文件和目录的监听。

PHP中提供了inotify扩展,支持了inotify系统调用。inotify本身也是一个文件描述符,可以加入到事件循环中,配合使用swoole扩展,就可以异步非阻塞地实时监听文件/目录变化。

安装inotify/swoole扩展

如果已经安装了inotify/swoole可以跳过此步骤。

pecl install swoolepecl install inotify

操作成功后,修改php.ini,加入

extension=swoole.soextension=inotify.so

查看扩展是否加载成功:

php -m | grep swoolephp -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.datainotify 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官方网站中查看 

  • 关于swoole更多信息,请到swoole官方网站取了解   

转载于:https://my.oschina.net/matyhtf/blog/343508

你可能感兴趣的文章
ECSHOP报错误Deprecated: preg_replace(): The /e modifier is depr
查看>>
【iOS】iOS之Button segue弹出popOver消除(dismiss)问题
查看>>
java多线程系列5-死锁与线程间通信
查看>>
数据库分库分表
查看>>
Modelsim编译Xilinx器件库的另一种方法
查看>>
腾讯Hermes设计概要——数据分析用的是列存储,词典文件前缀压缩,倒排文件递增id、变长压缩、依然是跳表-本质是lucene啊...
查看>>
打造 Vue.js 可复用组件
查看>>
Thrift安装介绍
查看>>
ARP协议(1)什么是ARP协议
查看>>
小程序模板嵌套以及相关遍历数据绑定
查看>>
Systemd入门教程:命令篇(转)
查看>>
java随机范围内的日期
查看>>
Python 工匠:编写条件分支代码的技巧
查看>>
Jmeter -----计数器(counter)
查看>>
用delphi生成GBK 中文编码 表(4~5) GBK/4~5: 0xAA40~0xFEA0(部分) 扩充汉字 包括繁体 0xA...
查看>>
修改python系统默认编码的一种方法
查看>>
MySQL 按日期分表
查看>>
技术平台比较(J2EE,.NET,Lotus Notes)
查看>>
MFC CListCtrl的用法.Style/插入、删除、选中数据及排序问题等(转)
查看>>
用w32tm设置服务器时间同步
查看>>