inotifywaitを使用して新しいファイルがないかフォルダーを監視し、「close_write」が検出されたときにファイルのパスをphpスクリプトに送信して処理します。
コマンドは次のようになります。
inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php $LINE; done
sshで実行すると、完全に機能します。phpのexec()またはsystem()関数でラップすると、スーパーバイザーを使用してデーモンとして実行するために、通常はの絶対パスを含むwatcher.phpスクリプトに2番目の引数が渡されません。 inotifywaitをトリガーしたファイル。
exec()はスクリプトをまったくトリガーしませんが、passthru()とsystem()は実際にはwatcher.phpにヒットしますが、スクリプト自体のパスを含む最初の引数以外の引数はありません。
ラッパースクリプトが実行されると、フォルダーを監視するために、ionotifywaitからの出力が返されます。
Setting up watches. Beware: since -r was given, this may take a while!
Watches established.
新しいファイルがアップロードされても、何も起こりません。watcher.phpはトリガーされません。
passthru()またはsystem()を使用してファイルをアップロードすると、watcher.phpにヒットし、ファイルの先頭でこれを実行します。print_r($argv);
passthru("inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php $LINE; done");
これは出力のみ
Array (
[0] => /home/scripts/watcher.php
)
cliでionotifywaitコマンドを手動で実行すると、新しいファイルがアップロードされたときに期待される出力が出力されます。
Array
(
[0] => /home/scripts/watcher.php
[1] => /path/to/dir/hello.jpg
)