我知道我们可以使用以下命令运行后台进程:
exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");
(取自:Run PHP Task asynchronous)
然而,我有一个依赖于第一次执行状态的脚本。例子:
mongoexport ... | awk ... > my.csv && zip myzip my.csv
CSV文件必须存在才能进行压缩。
更新:文件名和一些查询条件是用户提交的值。
所以我有这样的东西:
exec("mongoexport ... | awk ... > my.csv && zip myzip my.csv > /dev/null 2>&1 &);
但这不起作用。PHP挂起,等待脚本完成运行。
我试着
exec("mongoexport ... | awk ... > my.csv &);
。
那么&&
是它没有在后台运行的原因吗?
如何使示例在后台运行?
exec("(mongoexport ... | awk ... > my.csv && zip myzip my.csv) > /dev/null 2>&1 &")
它告诉shell在后台进程中运行括号中包含的所有命令序列并重定向输出,因此exec
函数没有什么可等待的。
在您的示例中,从exec
启动的shell等待awk
完成,然后在后台运行zip
(如果awk以状态0退出)