Linux 파일 폴더 재귀 모니터링
표준 PHP 작곡가 패키지를 개발했으며, 사용 시 요구하면 됩니다.
구현
PHP 버전의 구현은 쉘 버전의 개념을 따르고 있으며, 쉘 명령의 결과를 파이프 명령을 통해 전달한 후 그 결과에 대해 다양한 처리를 수행하여 달성합니다. 파일을 모니터링하는 목적.
이 기능을 완료하려면 먼저 파이프라인 명령의 PHP 버전을 구현해야 합니다. 여기에서는 명령의 반환 값이 반환되도록 popen 리소스(문자열 $command, 문자열 $mode)를 캡슐화했습니다. 매우 친절하게 처리될 수 있습니다.
위 모듈을 완료한 후 다음 단계는 구체적인 구현입니다. 정규 매칭을 포함하여 다중 경로 재귀 모니터링을 추가하고 정규 매칭을 제외하는 등 여러 가지 친숙한 구현 방법이 있습니다.
파이프 개발
<?php/** * php对对popen的封装,通过回调的方式模拟管道命令 * */namespace Aizuyan\Pipe;class Pipe{ /** * 要通过管道执行的命令 */ protected $command = ""; /** * 回调函数,将管道数据传递给该函数 */ protected $callback = null; /** * 数据之间的分隔符 */ protected $delimiter = "\n"; /** * 设置命令 * * @param cmd string 要运行的命令 */ public function setCmd($cmd) { $this->command = $cmd; return $this; } /** * 设置回调函数,处理管道输出的命令 */ public function setCallback(callable $cb) { $this->callback = $cb; return $this; } /** * 设置数据片段之间的分隔符 */ public function setDelimiter($delimiter) { $this->delimiter = $delimiter; return $this; } /** * 开始运行 */ public function run() { $fp = popen($this->command, "r"); if (false === $fp) { throw new \RuntimeException("popen execute command failed!"); } $item = ""; while (!feof($fp)) { $char = fgetc($fp); if ($this->delimiter == $char) { call_user_func($this->callback, $item); $item = ""; } else { $item .= $char; } } pclose($fp); } }
다음은 테스트 프로그램입니다
include "vendor/autoload.php";tail -f /root/t.txt 쉘 명령의 반환 결과를 실시간으로 처리하고, setCallback(callable func)은 콜백 함수에서 func의 매개변수는 쉘 명령의 표준 출력이며, setDelimiter($delimiter)는 콜백 함수에 전달된 매개변수의 구분 기호를 설정하여 출력이 쉽고 의도적으로 콜백 함수에 전달될 수 있도록 합니다.
inotify 개발
코드의 이 부분은 주로 위의 Pipe에 의존하며 inotifywait -mrq --format '%w,%e,%f를 출력합니다. ' 명령을 처리하고 정방향 및 역방향 필터링을 위해 Inotify를 호출하면 다음과 같습니다
<?php require "vendor/autoload.php"; $obj = new Aizuyan\Inotify\Inotify(); $obj->addExclude([ "/swp$/", "/swpx$/", "/~$/", "/\d$/", "/swx$/" ])->setCallback(function ($item){ echo $item["event"] . " 文件 " . $item["file"] . "\n"; })->addPaths("/datas/git/")->start();
이렇게 실행한 후 /datas/git 디렉터리의 파일을 수정하면 다음과 같은 내용이 됩니다. 수정된 파일의 사용자 정의 처리
CREATE 文件 /datas/git/inotify/README.md MODIFY 文件 /datas/git/inotify/README.md MOVED_TO 文件 /datas/git/aizuyan/pinyin-1/README.md DELETE 文件 /datas/git/aizuyan/pinyin-1/LICENSE ......
inotify-tools 설치
전체 기능은 Linux 소프트웨어에 의존합니다 - inotify-tools
centos 설치 yum install inotify -tools, 아니면 소스코드(문서)에서 직접 설치해서 OS에 설치해 봤는데 실패하는 걸 발견~
사용법
작곡가에게 퍼블리싱해 놓았습니다 저장소이며 쉽게 설치할 수 있습니다:
composer에 aizuyan/inotify가 필요하면 위의 예처럼 사용할 수 있습니다.
또한 개발된 두 구성 요소의 github 주소입니다: AizuyanPipePipe, AizuyanInotifyInotify