ホームページ >バックエンド開発 >PHPチュートリアル >Linuxファイルフォルダの再帰監視

Linuxファイルフォルダの再帰監視

高洛峰
高洛峰オリジナル
2016-11-02 10:47:101311ブラウズ

Linux ファイルフォルダーの再帰監視

標準の php コンポーザー パッケージを開発しました。使用するときにのみ必要です。

実装

PHPバージョンの実装はシェルバージョンの考え方に従い、パイプコマンドを介してシェルコマンドの結果を渡し、その結果に対してさまざまな処理を実行してファイルを監視するという目的を達成します。

この関数を完了するには、まず PHP バージョンのパイプライン コマンドを実装する必要があります。ここでは、コマンドの戻り値を処理できるように、リソース Popen (string $command、string $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();

pair tail -f / root/t.txt シェルコマンドの戻り結果はリアルタイムで処理されます。 setCallback(callable func) はコールバック関数を設定します。 setDelimiter($delimiter) はシェルコマンドの標準出力です。受信コールバック関数のパラメータに対して、出力を簡単かつ任意にコールバック関数に渡すことができます。

inotify 開発

コードのこの部分については触れません。主に上記の Pi​​pe に依存し、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 require aizuyan/inotify で、上記の例のように使えます

また、これは github のアドレスです開発された 2 つのコンポーネント: AizuyanPipePipe、AizuyanInotifyInotify


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。