<?PHPの クラスのモニター { 公共$ DIR = ''; 公共$ cmdを= ''; 公共$タイムアウト= 1; パブリック関数__construct() { IF {(extension_loaded)( 'はinotify'!) エコー'inotifyの拡張機能をインストール' ;、値はPHP_EOLある ;出口は } 番号必要表す:、コマンドラインパラメータを解析// ( '['、 'CMD:DIR'] '')$ = OPTSのgetoptと、 IF(OPTSを$!){ エコー'パラメータ入力エラー'は、値がPHP_EOLあり; 出口; } (空(OPTSの$ [ 'DIR'])){IF エコー'が必要とされる--dir'、値がPHP_EOLあり; 出口; } (空($ OPTS [ 'CMD']))であれば{ ;値がPHP_EOLで、 '--cmdは必須である'エコー 出口; } の$ this - > OPTS DIR = $ [ 'DIR']; の$ this - > CMD = TRIM(OPTSが$ [ 'CMD']); の$ this - > RUN(); } //ディレクトリ監視 パブリックRUN関数() { $ DIRS =の$ this - > getDirs(this- $> DIR)を、 IF(空($ DIRS)){ 偽に戻り、 } $ FD = inotify_init(); //はノンブロッキングモード設定 stream_set_blocking(FDの$、0); {(DIR $ $ dirsにAS)のforeach $ =ウォッチはinotify_add_watch(FD $は、IN_MODIFYとして、ディレクトリを$ | IN_CREATE | IN_DELETE | IN_DELETE_SELFを| IN_CLOSE_WRITE)。 (もし!$腕時計){ エコー"{$のDIR}監視エラーを追加する"の値がPHP_EOLあり、; 出口; } } (trueに)しばらく{ $ = [$ FD]を読み出し、 $書き込み= []; $ = []を除く; IF(てstream_select($読み出し、$書き込み、タイムアウト> $、の$ this -を除く)> 0){ (空の())$を読み取る場合、{! foreachの($ $)ASを読み込む読む{ //ファイルの変更 $ = fileChg falseに; //ディレクトリの変更 $ dirChg =偽; //から読み出されたデータストリームの読み取り ; = inotify_readイベント($読み)$ $ファイル名を= ''; foreachの($イベントとしてイベント$){ $ファイル名= $イベント[ '名前']。 スイッチ($イベント[ 'マスク']){ ケースIN_CREATE: ケースIN_DELETE: $ fileChg = TRUE。 ブレーク; ケース1073742080: ケース1073742336: $ dirChg =はtrue。 ブレーク; } } もし($ fileChg){ エコー「ファイル{$ファイル名}が行わ、変更しましたの$ this -コマンド{>} CMD」、値はPHP_EOLあり; エコーもしくはshell_exec(の$ this - > CMD)、値はPHP_EOLあり; } IF($ dirChg){ エコー"{$ファイル名}ディレクトリの変更、実行{の$ this - > CMD}"、値PHP_EOLであり、 エコーはshell_exec(の$ this - > CMD)、値がPHP_EOLである。 しますreturn $ this-> RUN(); } } } } } をtrueに復帰; } アクセサリーサブディレクトリパスカレントディレクトリ//再帰的に パブリック関数getDirs($ DIR ) { $のrealpath DIR =($ DIR); $ DHはopendirなど($ DIRを=); !IF($ DH)は{ []を返します。 } $ DIRS = []; $ DIRS [] = $ DIR。 (!($ファイル= readdirの($ DH))== false)の{しばらく ( '' '..' == $ファイル|| $ファイル==)場合は{ 続けます。 } $の完全= $ dirを。DIRECTORY_SEPARATOR。$ファイル; (is_dir(フル$)){もし $ DIRS = array_merge($ DIRS、の$ this - > getDirsフル($))。 } } closedirの($のDH)。 $ dirsにを返します。 } } (新しいモニタ())。