文档章节

swoole+inotify实现异步实时文件监控

matyhtf
 matyhtf
发布于 2014/11/12 13:54
字数 641
阅读 6053
收藏 73

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操作。



© 著作权归作者所有

共有 人打赏支持
matyhtf

matyhtf

粉丝 413
博文 13
码字总数 7425
作品 8
深圳
程序员
私信 提问
加载中

评论(3)

小妖万岁
PHP Fatal error: swoole_event_add(): async-io must use in cli environment. 这个函数 不能用。。。。
徐长龙
徐长龙
补充,我照着做了下,手欠加了个while和sleep就挂了。。这个代码结尾不需要死循环和sleep~
prpr
prpr
与sersync比如何?
OSChina 技术周刊第九期 —— 每周技术精选,值得一看!

每周技术抢先看,总有你想要的! 移动开发 【翻译】介绍 Visual Studio 的 Android 模拟器 【博客】手机腾讯网mt框架之mtwebapp示例解析。 【博客】《Android深入透析》之常用设计模式经验谈...

OSC编辑部
2014/11/16
3.8K
4
ischitry/LogMonitor

LogMonitor - Log日志Web在线同步监控 LogMonitor是一款简易的日志web在线监控工具,使用servlet3.0异步servlet技术,整个项目中的主要文件仅有4个,复杂度低,使用它,你可以很方便将他集成...

ischitry
2016/09/28
0
0
实时备份工具之inotify+rsync

1.inotify简介 inotify 是一个从 2.6.13 内核开始,对 Linux 文件系统进行高效率、细粒度、异步地监控机制, 用于通知用户空间程序的文件系统变化。可利用它对用户空间进行安全、性能、以及其...

IT_外卖小哥
10/30
0
0
大众点评开源分布式监控平台 CAT 深度剖析

一、CAT介绍 CAT系统原型和理念来源于eBay的CAL的系统,CAT系统第一代设计者吴其敏在eBay工作长达十几年,对CAL系统有深刻的理解。CAT不仅增强了CAL系统核心模型,还添加了更丰富的报表。自2...

王练
2016/10/31
12K
11
深度剖析开源分布式监控系统CAT的设计思路

自2014年开源以来,除了美团点评之外,CAT还在携程、陆金所、猎聘网、找钢网等多家互联网公司生产环境应用,项目的开源地址是http://github.com/dianping/cat。 背景介绍 CAT整个产品研发是从...

满小茂
2016/11/10
1
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
22分钟前
1
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
52分钟前
2
0
SpringBoot 整合异步调用方法

1. 在 SpringBoot 主类上使用 @EnableAsync 注解,开启异步调用功能 package com.codingos.springbootdemo;import org.springframework.boot.SpringApplication;import org.springfra......

北漂的我
今天
1
0
0015-如何使用Sentry管理Hive外部表权限

1.文档编写目的 本文档主要讲述如何使用Sentry对Hive外部表权限管理,并基于以下假设: 1.操作系统版本:RedHat6.5 2.CM版本:CM 5.11.1 3.集群已启用Kerberos和Sentry 4.采用具有sudo权限的...

Hadoop实操
今天
3
0
边缘计算与数据中心的发展趋势

导读 Gartner研究表明,人工智能、物联网和5G助力下一代商业创新,由此产生大量数据,2020年前企业将使用超过75亿台联网设备。 在几乎每个方面,社会的节奏都正变得更快。我们希望客户服务问...

问题终结者
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部