php使用inotify扩展监控文件或目录,如果发生改变,就执行指定命令
通过inotify扩展监控文件或目录的变化,如果发生变化,就执行命令。
可以应用于 swoole 中,如果文件发生变化,就执行 kill -USR1 进程PID 来实现热更新。
<?php
class Monitor
{
public $dir = '';
public $cmd = '';
public $timeout = 1; public function __construct()
{
if (!extension_loaded('inotify')) {
echo '请安装inotify扩展', PHP_EOL;
exit;
}
//解析命令行参数,有一个:号表示必填项
$opts = getopt('', ['dir:', 'cmd:']);
if (!$opts) {
echo '参数输入错误', PHP_EOL;
exit;
}
if (empty($opts['dir'])) {
echo '--dir 是必填项', PHP_EOL;
exit;
}
if (empty($opts['cmd'])) {
echo '--cmd 是必填项', PHP_EOL;
exit;
}
$this->dir = $opts['dir'];
$this->cmd = trim($opts['cmd']);
$this->run();
} //对目录进行监控
public function run()
{
$dirs = $this->getDirs($this->dir);
if (empty($dirs)) {
return false;
}
$fd = inotify_init();
//设置为非阻塞模式
stream_set_blocking($fd, 0);
foreach ($dirs as $dir) {
$watch = inotify_add_watch($fd, $dir, IN_MODIFY | IN_CREATE | IN_DELETE | IN_DELETE_SELF | IN_CLOSE_WRITE);
if (!$watch) {
echo "{$dir} 添加监控错误", PHP_EOL;
exit;
}
}
while (true) {
$reads = [$fd];
$write = [];
$except = [];
if (stream_select($reads, $write, $except, $this->timeout) > 0) {
if (!empty($reads)) {
foreach ($reads as $read) {
//文件改变
$fileChg = false;
//目录改变
$dirChg = false;
//从可读流中读取数据
$events = inotify_read($read);
$fileName = '';
foreach ($events as $event) {
$fileName = $event['name'];
switch ($event['mask']) {
case IN_CREATE:
case IN_DELETE:
$fileChg = true;
break;
case 1073742080:
case 1073742336:
$dirChg = true;
break;
}
}
if ($fileChg) {
echo "文件 {$fileName} 发生改变, 执行命令 {$this->cmd}", PHP_EOL;
echo shell_exec($this->cmd), PHP_EOL;
}
if ($dirChg) {
echo "目录 {$fileName} 发生改变, 执行命令 {$this->cmd}", PHP_EOL;
echo shell_exec($this->cmd), PHP_EOL;
return $this->run();
}
}
}
}
}
return true;
} //递归的获取当前目录下所有子目录路径
public function getDirs($dir)
{
$dir = realpath($dir);
$dh = opendir($dir);
if (!$dh) {
return [];
}
$dirs = [];
$dirs[] = $dir;
while (($file = readdir($dh)) !== false) {
if ($file == '.' || $file == '..') {
continue;
}
$full = $dir . DIRECTORY_SEPARATOR . $file;
if (is_dir($full)) {
$dirs = array_merge($dirs, $this->getDirs($full));
}
}
closedir($dh);
return $dirs;
}
} (new Monitor());
演示如下所示:

php使用inotify扩展监控文件或目录,如果发生改变,就执行指定命令的更多相关文章
- php使用inotify扩展监控文件或目录的变化
一.安装inotify扩展 1.下载inotify扩展源码 https://pecl.php.net/package/inotify 对于php7以上版本,请下载 inotify-2.0.0.tgz. ...
- CentOS(十)--与Linux文件和目录管理相关的一些重要命令②
在结束了第二期的广交会实习之后,又迎来了几天休闲的日子,继续学习Linux.在上一篇随笔 Linux学习之CentOS(十七)--与Linux文件和目录管理相关的一些重要命令① 中,详细记录了与Lin ...
- CentOS(九)--与Linux文件和目录管理相关的一些重要命令①
接上一篇文章,实际生产过程中的目录管理一定要注意用户是root 还是其他用户. 一.目录与路径 1.相对路径与绝对路径 因为我们在Linux系统中,常常要涉及到目录的切换,所以我们必须要了解 & ...
- 网卡配置文件详解 用户管理与文件权限篇 文件与目录权限 软连接 tar解压命令 killall命令 linux防火墙 dns解析设置 计划任务crond服务 软件包安装 阿里云 yum源 安装
Linux系统基础优化及常用命令 Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ...
- C#改动文件或目录的权限,为指定用户、用户组加入全然控制权限
C#改动文件或文件夹的权限,为指定用户.用户组加入全然控制权限 //给Excel文件加入"Everyone,Users"用户组的全然控制权限 FileInfo fi = new F ...
- 根据 inotify 自己开发软件监控文件系统活动
了解 inotify Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除.读.写和卸载操作等.您还可以跟踪活动的源头和目标等细节. 使用 ...
- 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序
原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...
- rsync+inotify百万级文件实时同步
实验环境:Centos7.4 目的:将源服务器的文件实时同步至目标服务器 源服务器:10.11.1.107 目标服务器:10.11.1.106 分别在两个节点安装rsync yum -y instal ...
- python文件和目录操作方法大全(含实例)
一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目 ...
随机推荐
- September 08th, 2019. Sunday, Week 37th.
A heavy drew refreshed the earth at night. 夜晚厚重的露水滋养着大地. From Leo Tolstoy. Today is the White Drew D ...
- 08-Django 模板
需要教程的请关注个人微信公众号 模板:产生html,用于控制页面的展示,模板不仅仅是一个html文件,它包含两部分内容: 静态内容:css,js,image 动态内容:用模板语言语言动态的产生一些网页 ...
- 【bzoj4671】异或图(容斥+斯特林反演+线性基)
传送门 题意: 给出\(s,s\leq 60\)张图,每张图都有\(n,n\leq 10\)个点. 现在问有多少个图的子集,满足这些图的边"异或"起来后,这张图为连通图. 思路: ...
- 深入浅出xpath轴定位
在web自动化里面经常要用到定位,常用的八种定位方式中我最喜欢xpath定位,功能很强大.结合它里面的文本定位.模糊定位.逻辑定位等,基本能搞定所有的元素定位问题. 今天要讨论的是xpath的另一种比 ...
- day96_11_28 mongoDB与scrapy框架
一.mongodb mongodb是一个面向文档的数据库,而不是关系型数据库.不采用关系型是为了获得更好的扩展性. 它与mysql的区别在于它没有表连接,但是可以通过其他办法实现. 安装数据库. 上官 ...
- [CodeForces - 1272D] Remove One Element 【线性dp】
[CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...
- 2019年最新阿里Java工程师面试题
一.单选题(共10题,每题5分) 1 关于设计模式遵循的原则,说法错误的是? A.组合优于继承 B.针对实现编程 C.对扩展开放,对修改关闭 D.降低对象之间的耦合 参考答案:B 答案解析: 设计 ...
- QT使用QPainter加水印
QT使用QPainter加水印 加水印的代码 //为QPixmap添加水印 void MainWindow::addMask(QPixmap& pm, const QString& t ...
- (三十八)c#Winform自定义控件-圆形进度条-HZHControls
官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...
- C# 同步转异步 TaskCompletionSource
当我们遇到一些异步执行又无法等待时的逻辑,比如动画的执行. 而业务上又需要等待逻辑的完成,再去处理后续的操作.这时需要转成异步方法 如下,同步执行一个动画后,再输出日志: private async ...