ファイルやディレクトリのinotify拡張モニタを使用してPHPは、変更された場合は、指定されたコマンドを実行します

<?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にを返します。
    } 
} 

(新しいモニタ())。

  

おすすめ

転載: www.cnblogs.com/jkko123/p/10960439.html