Rekursive Überwachung von Linux-Dateiordnern
Es wurde ein Standard-PHP-Composer-Paket entwickelt, das Sie bei der Verwendung einfach benötigen können.
Implementierung
Die Implementierung der PHP-Version folgt der Idee der Shell-Version, die Ergebnisse des Shell-Befehls über Pipe-Befehle zu übergeben und dann verschiedene Verarbeitungen an den Ergebnissen vorzunehmen, um sie zu erzielen Unser Zweck der Überwachung von Dateien.
Um diese Funktion abzuschließen, müssen wir zunächst eine PHP-Version des Pipeline-Befehls implementieren. Hier habe ich die Ressource popen (String $command, String $mode) gekapselt, sodass der Rückgabewert des Befehls entsteht kann sehr freundlich bearbeitet werden.
Nach Abschluss des obigen Moduls ist der nächste Schritt die spezifische Implementierung. Es gibt mehrere benutzerfreundliche Möglichkeiten, es zu implementieren, einschließlich des Hinzufügens einer rekursiven Mehrpfadüberwachung, einschließlich des regulären Abgleichs, und des Ausschlusses des regulären Abgleichs.
Pipe-Entwicklung
<?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); } }
Das Folgende ist das Testprogramm
Verarbeitet das Rückgabeergebnis des Shell-Befehls tail -f /root/t.txt in Echtzeit, setCallback(callable func) legt das fest Rückruffunktion, der Parameter von func ist die Standardausgabe des Shell-Befehls, und setDelimiter($delimiter) legt das Trennzeichen der an die Rückruffunktion übergebenen Parameter fest, sodass die Ausgabe einfach und beliebig an die Rückruffunktion übergeben werden kann.
inotify development
Dieser Teil des Codes wird nicht erwähnt. Er basiert hauptsächlich auf der oben genannten Pipe und gibt dann das inotifywait -mrq --format '%w,%e,%f aus ' Befehl. Für die Verarbeitung, Vorwärts- und Rückwärtsfilterung folgt der Aufruf von 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();
Nachdem wir auf diese Weise die Dateien im Verzeichnis /datas/git geändert haben, wird der folgende Inhalt angezeigt Ausgabe, was sehr praktisch ist. Angepasste Verarbeitung geänderter Dateien inotify-tools, Oder installieren Sie es direkt aus dem Quellcode (Dokumentation) und versuchen Sie, es im Betriebssystem zu installieren, aber es schlägt fehl~
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 ......
Composer benötigen aizuyan/inotify, dann können Sie es wie im obigen Beispiel verwenden