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.返回指定目录下的所有文件和目 ...
随机推荐
- 使用ping网络工具编写Shell脚本程序实现网络连接故障初步排查
在学习ping命令的时候,突发奇想:为何不使用ping命令对网络连接故障进行排查? 具体思路: 1. ping 127.0.0.1 (虚拟网卡地址)以检查主机的TCP/IP协议栈是否正常. 2. p ...
- javascript地址引用
javascript地址引用 var a = new Object(); a.price = ; var b = a; b.price = ; //b更改了属性值,a的属性值一起会被改变 alert( ...
- xlwings 操作 excel
xlwings: xlwings是一个Python库,它使Python的一些数据分析特性可以在Excel实例中使用,包括对numpy数组.pandas Series和DataFrame的支持.与其他任 ...
- .net core 2.1 基于Jwt的登录认证
1.新建一个.net core2.1 基于 api 的工程,引用Microsoft.AspNetCore.Authentication.JwtBearer 包 2.新建一个Token的实体类,一个Jw ...
- 【重学Git】整理提交记录
有时候我们在本分支做了一个很小的更改提交,其他分支想直接拿到这个更改提交,有没有一种不像merge或rebase这么正式的做法呢?也就是说:我仅仅是想获取其中一个小改变而已.cherry-pick就是 ...
- 松软科技web课堂:SQLServer之LEN() 函数
LEN() 函数 LEN 函数返回文本字段中值的长度. SQL LEN() 语法 SELECT LEN(column_name) FROM table_name SQL LEN() 实例 我们拥有下面 ...
- vue-property-decorator使用指南
在Vue中使用TypeScript时,非常好用的一个库,使用装饰器来简化书写. 1.安装npm i -S vue-property-decorator @Prop @PropSync @Provide ...
- 中文版 Apple 官方 Swift 教程《The Swift Programming Language》
简介 欢迎使用 Swift 关于 Swift 版本兼容性 Swift 初见 Swift 版本历史记录 Swift 教程 基础部分 基本运算符 字符串和字符 集合类型 控制流 函数 闭包 枚举 类和结构 ...
- none 和 host 网络的适用场景
我们会首先学习 Docker 提供的几种原生网络,以及如何创建自定义网络.然后探讨容器之间如何通信,以及容器与外界如何交互. Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 h ...
- mongodb4版本,windows下的安装与配置(史上步骤最全最详细+图解)
安装的是4.2.1版本,安装途中出现过很多错误,找遍各种博客基本没能解决 1.mongodb安装的官方地址: https://www.mongodb.com/download-center/commu ...