我使用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()函数中时,为了将其作为带有管理程序的守护程序运行,它不会将第二个arg传递给通常包含绝对路径的watcher.php脚本。触发inotifywait的文件。
exec()甚至根本不触发脚本,而passthru()和system()实际上命中了watcher.php但没有第一个之外的args,其中包含脚本本身的路径。
当执行包装器脚本时,为了观察文件夹,它给出了来自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
)
答案 0 :(得分:0)
所以,这是你的问题。你的电话是:
passthru("inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php $LINE; done");
这些双引号正在插入$LINE
,好像它是一个PHP变量。结果调用看起来像
inotifywait -e close_write --format '%w%f' -m -r /path/do/dir | while read LINE; do php /home/scripts/watcher.php ; done
...这就是为什么param实际上没有传递给watcher.php。
你需要切换到单引号并明智地使用转义为命令中使用单曲的位,或者如果你使用5.3或更高版本则转换为nowdoc。