inotifyを使ったディレクトリ監視サンプル

前回の続き。
inotifyの関数を使ったディレクトリを監視するphpコードに関するメモ。

大まかな流れとしては、

  1. inotify_initで初期化する
  2. inotify_add_watchに対象のディレクトリとどんなイベントを監視するかを指定する
  3. whileループ内でinotify_readでイベントをwaitする
  4. イベントが着たら、情報が詰まった配列を取得する
  5. やりたい処理を行う
  6. ループを抜けて終了処理

監視対象ディレクトリを指定して実行する。(存在しない場合はエラーになる)

> php dir_monitor.php temp
watch directory : temp
[1] watching...

別のコンソールからtouchなどでファイルを作成する。

# touch sample.txt

イベントをキャッチして$eventの内容がダンプされる。
ダンプしているタイミングで、実際のやりたい処理を追加すればよい。

watch directory : temp
[1] watching...
 
 
Array
(
    [0] => Array
        (
            [wd] => 1
            [mask] => 256
            [cookie] => 0
            [name] => sample.txt
        )
 
)
created file = temp/sample.txt

※2014/06/15追記 なぜかファイルの作成が無視される

inotify_readでイベントをキャッチしたあと、重い処理(処理時間が数分)を入れると、ファイルが複数されても通知されない。(set_time_limit(0)でもダメ)

ファイルが一度に3個作成(追加)されても、1個目の重い処理を抜けると、2個目の通知が来ない。といった症状になる。散々悩んでも解決しないので、結局のところ、whileループ内でglob関数で特定ファイルの監視(sleepで数秒おきに)して、ファイルが見つかったら、重い処理を行う・・・というロジックに変更してしまった。。
数秒で終わる処理であれば問題ないが、こんな結果になろうとは。。