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.返回指定目录下的所有文件和目 ...
随机推荐
- Os-HackNos-Report
实验主机:Os-hackerNos靶机一台/Kali linux攻击机一台 实验网络:桥接网络 实验目标:获取靶机的Root权限 难易程度:简单 前期工作: 1:下载Virtualbox虚拟化软件(也 ...
- 《Web Development with Go》Middleware之使用gorilla.handlers
可以方便的使用日志和压缩等功能. package main import ( "fmt" "log" "net/http" "os ...
- Linux下安装Redis以及遇到的问题
参考链接:https://www.cnblogs.com/zdd-java/p/10288734.html https://www.cnblogs.com/uncleyong/p/9882843.ht ...
- yii2 提示
控制器中: Yii::$app->getSession()->setFlash('success', "描述!"); Yii::$app->getSession( ...
- Spring Boot 配置文件中的花样,看这一篇足矣!
在快速入门一节中,我们轻松的实现了一个简单的RESTful API应用,体验了一下Spring Boot给我们带来的诸多优点,我们用非常少的代码量就成功的实现了一个Web应用,这是传统的Spring应 ...
- (转)颜色直方图, HSV直方图, histogram bins
原文链接:https://www.xuebuyuan.com/3256564.html 一个histogram,通常可以用一个列向量表示(例子中的a,b),列向量里面的每一个值就是一个bin(a,b) ...
- Python爬虫实战教程:爬取网易新闻
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Amauri PS:如有需要Python学习资料的小伙伴可以加点击 ...
- BeanUtils.populate()空字符串转换日期的解决办法
我们在使用beanutils.populate()封装参数时,如果封装的字符串是空,在转换成date时会出现以上异常,此时可以在工具类中添加静态代码块即可解决:注意导入beanutils 包 impo ...
- linux学习(五)用户与组管理命令,以及用户信息文件解释
目录 (1)/etc/passwd文件 (2)/etc/shadow passwd命令 userdel命令 usermod命令 groupadd @(用户与组管理命令) linux是一个多用户多任务的 ...
- 自写的简单MD5加密算法
package com.srs.tools; import java.math.BigInteger; import java.security.MessageDigest; /*********** ...