>  기사  >  백엔드 개발  >  Linux 파일 폴더 재귀 모니터링

Linux 파일 폴더 재귀 모니터링

高洛峰
高洛峰원래의
2016-11-02 10:47:101235검색

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";
$test = new RitoyanPipePipe( ) ;
$test->setCmd("tail -f /root/t.txt")->setCallback(function($item){
echo "콘텐츠 가져오기:" . $item . "n";
})->setDelimiter("n")->run();

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


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.