首页 » 网站推广 » inotifywait监听php技巧_文件同步监控对象

inotifywait监听php技巧_文件同步监控对象

访客 2024-12-12 0

扫一扫用手机浏览

文章目录 [+]

,这样就不能用git去更新代码了,你要更新了代码别人的功能就被你覆盖了,

而一个取而代之的方法是通过rz同步代码文件,但这效率太低了,而且有可

inotifywait监听php技巧_文件同步监控对象

能复制错。

inotifywait监听php技巧_文件同步监控对象
(图片来自网络侵删)

刚好之前做过fe开拓,利用过百度的fisp,他的一个很主要的功能便是代码发 布,于是沿着这个思路做出了这个工具。

如何监控文件

这里面最大的问题便是办理如何监控文件了,成百上千的文件、文件夹如何高效的监控,

我首先想到的还是php有没有这样的扩展,果不其然,找到了一个扩展类库inotify

他有inotify_5个函数,但是功能太弱了让我大失落所望,不能递归监控文

件夹,只能放弃利用php实现这个功能了。

沿着最开始的路线inotify连续探索,找到了linux下面的命令inotify-tools

,这个工具的功能就比较强大了,可以递归的监测文件夹及其子文件夹下面的文件

,于是就用shell实现了一个文件监控同步工具,预知详细细节,请连续往下看,

问题一个个的办理

如何将文件保存到做事器

这个借鉴了fisp的设计,在做事器上边放一个接管文件的脚本,通过http的办法

将文件和要保存的地方发送给脚本,脚本进行保存,然后返回结果。

这个方法的优点很明显:在互联网公司,web做事一样平常都是有支配的,直接将脚本放上去 配置好目录权限,就可以用了,大略方便。

下面是做事端脚本的php代码

<?php@error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);function mkdirs($path, $mod = 0777) { if (is_dir($path)) { return chmod($path, $mod); } else { $old = umask(0); if(mkdir($path, $mod, true) && is_dir($path)){ umask($old); return true; } else { umask($old); } } return false;}if($_POST['to']){ $to = urldecode($_POST['to']); if(is_dir($to) || $_FILES[\公众file\"大众][\公众error\"大众] > 0){ header(\"大众Status: 500 Internal Server Error\"大众); } else { if(file_exists($to)){ unlink($to); } else { $dir = dirname($to); if(!file_exists($dir)){ mkdirs($dir); } } echo move_uploaded_file($_FILES[\"大众file\"大众][\"大众tmp_name\"大众], $to) ? 0 : 1; }} else { echo 'I\'m ready for that, you know.';}

实现

监控也有了,上传文件也有了,接下来便是详细的实现了:

首先便是解析运行脚本时候的参数,看看是否全量发布,是否监控,以及指定的做事器。
发布,发布这里事理很大略,但实际实现的时候很麻烦,从监控的文件夹中最长匹配路径,搜索、拼接路径,然后通过curl发布。
监控,监控用了管道命令,让inotify-tools一贯等待,有修正就通报给管道后面的程序,管道后面的程序进行发布。

例子

在利用之前一定要确保安装了inotify-tools,监控依赖于这个软件中inotifywait功能,

一样平常可以直策应用yum install inotify-tools安装该软件

我利用的一个小例子,首先必须能存在的是配置文件,config.sh

declare -A paths uploadspaths[actions]=/usr/local/nginx/html/actions/paths[controllers]=/usr/local/nginx/html/controllers/uploads[test1]=\"大众http://10.211.55.3/receiver.php\"大众uploads[test2]=\"大众http://10.211.55.3/receiver.php\"大众

paths数组的键值定义了监控的文件夹名称,uploads定义了发布的做事器名称和地址

利用示例

命令 -d | --dest-server是指定做事器名称,后边的发布就会发布到该做事器,-a | --all

会将所有的文件发布一边,-w | --watch会监控所有的文件,有改动进行发布,-h | --help是查看帮助

github地址

欢迎一起改进优化

参考文章&记录条记字符串截取

标签:

相关文章