通过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扩展监控文件或目录,如果发生改变,就执行指定命令的更多相关文章

  1. php使用inotify扩展监控文件或目录的变化

    一.安装inotify扩展 1.下载inotify扩展源码 https://pecl.php.net/package/inotify 对于php7以上版本,请下载 inotify-2.0.0.tgz. ...

  2. CentOS(十)--与Linux文件和目录管理相关的一些重要命令②

    在结束了第二期的广交会实习之后,又迎来了几天休闲的日子,继续学习Linux.在上一篇随笔 Linux学习之CentOS(十七)--与Linux文件和目录管理相关的一些重要命令① 中,详细记录了与Lin ...

  3. CentOS(九)--与Linux文件和目录管理相关的一些重要命令①

       接上一篇文章,实际生产过程中的目录管理一定要注意用户是root 还是其他用户. 一.目录与路径 1.相对路径与绝对路径 因为我们在Linux系统中,常常要涉及到目录的切换,所以我们必须要了解 & ...

  4. 网卡配置文件详解 用户管理与文件权限篇 文件与目录权限 软连接 tar解压命令 killall命令 linux防火墙 dns解析设置 计划任务crond服务 软件包安装 阿里云 yum源 安装

    Linux系统基础优化及常用命令 Linux基础系统优化 引言没有,只有一张图. Linux的网络功能相当强悍,一时之间我们无法了解所有的网络命令,在配置服务器基础环境时,先了解下网络参数设定命令. ...

  5. C#改动文件或目录的权限,为指定用户、用户组加入全然控制权限

    C#改动文件或文件夹的权限,为指定用户.用户组加入全然控制权限 //给Excel文件加入"Everyone,Users"用户组的全然控制权限 FileInfo fi = new F ...

  6. 根据 inotify 自己开发软件监控文件系统活动

    了解 inotify Inotify 是一个 Linux 内核特性,它监控文件系统,并且及时向专门的应用程序发出相关的事件警告,比如删除.读.写和卸载操作等.您还可以跟踪活动的源头和目标等细节. 使用 ...

  7. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序

    原始博文和参考博文 1.CentsOS系统inotify实时监控服务器文件 2.Linux中让进程在后台运行的方法 3.linux inotify 监控文件系统事件 非常好 方法一 说明: 服务器系统 ...

  8. rsync+inotify百万级文件实时同步

    实验环境:Centos7.4 目的:将源服务器的文件实时同步至目标服务器 源服务器:10.11.1.107 目标服务器:10.11.1.106 分别在两个节点安装rsync yum -y instal ...

  9. python文件和目录操作方法大全(含实例)

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法.1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd()2.返回指定目录下的所有文件和目 ...

随机推荐

  1. [考试反思]1113csp-s模拟测试114:一梦

    自闭.不废话.写一下低错. T1:觉得信心赛T1不会很恶心一遍过样例直接没对拍(其实是想写完T2之后回来对拍的) 状态也不好,基本全机房都开始码了我还没想出来(skyh已经开T2了).想了40多分钟. ...

  2. 递归找到多级文件夹中所有pdf文件的py程序

    因个人需要,写了一个可以递归找到多级文件夹中所有pdf的小程序,发布出来供有需要的人参考或使用. import os import re import shutil from os.path impo ...

  3. Python3字典update()方法

    描述 Python字典update()函数把字典参数dict2的key/value(键/值)对更新到字典dict里. update()方法语法: dict.update(dict2) 参数 dict2 ...

  4. Python 从入门到进阶之路(五)

    之前的文章我们简单介绍了一下 Python 的函数,本篇文章我们来看一下 Python 中的面向对象. Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是 ...

  5. 从七个方面,面试BAT大厂高级工程师,纯干货!

    转载注明:https://blog.csdn.net/WantFlyDaCheng/article/details/100078782 一.框架是重点,但别让人感觉你只会山寨别人的代码 二.别单纯看单 ...

  6. 最小割最大流定理&残量网络的性质

    最小割最大流定理的内容: 对于一个网络流图 $G=(V,E)$,其中有源点和汇点,那么下面三个条件是等价的: 流$f$是图$G$的最大流 残量网络$G_f$不存在增广路 对于$G$的某一个割$(S,T ...

  7. WebGIS小理论(持续更新)

    什么是OWC服务体系 它是开放地理空间协会(Open Geospatial Consortium,OGC)提出的OGC Web服务通用规范. 主要内容: 地理数据服务(Data Service) 对空 ...

  8. SDWebImage4.0之后加载gif不显示的解决方案

    SDWebImage4.0之前 UIImageView *imgView = [UIImageView new]; imgView.contentMode = UIViewContentModeSca ...

  9. 【转载】Android Context 到底是什么?

    什么是Context? 一个Context意味着一个场景,一个场景就是我们和软件进行交互的一个过程.比如当你使用微信的时候,场景包括聊天界面.通讯录.朋友圈,以及背后的一些数据. 那么从程序的角度来看 ...

  10. 快速掌握MIPI开发攻略,对接百度人工智能计算卡EdgeBoard

    MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写,是MIPI联盟发起的为移动应⽤处理器制定的开放标准.MIPI采⽤高速串行接口传输数据,满⾜ ...