【问题标题】:PHP background process with && in commandPHP后台进程与&&命令
【发布时间】:2013-05-06 09:30:37
【问题描述】:

我知道我们可以使用以下命令运行后台进程:

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

(取自:Run PHP Task Asynchronously

但是我有一个脚本,它取决于第一次执行的状态。示例:

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 &);

这行得通。

&& 是它不在后台运行的原因吗?
如何让示例在后台运行?

【问题讨论】:

  • 你有没有机会把它变成一个shell脚本并从PHP运行那个shell?
  • 我应该补充一点,shell 命令接受用户提交的参数。例如文件名是用户指定的。所以我猜没有shell脚本。
  • 我不确定UNIX shell,但是在Win32 bat中,可以使用%1%2等或者直接%s传递参数,所以如果my.csvmyzip 是用户提交的参数,也许你可以发出命令 shell.sh my.csv myzip > /dev/null 2>&1 & 和 shell mongoexport... %1 && %2 或类似的东西。
  • 我想我可以将变量作为参数传递给 shell 脚本。谢谢。如果没有更好的方法,我会把它作为最后的手段。

标签: php exec background-process


【解决方案1】:

以下将起作用

exec("(mongoexport ... | awk ... > my.csv && zip myzip my.csv) > /dev/null 2>&1 &")

它告诉外壳程序在后台进程中运行所有用大括号括起来的命令序列并重定向输出,因此exec函数无需等待。

在您的示例中,从 exec 启动的 shell 等待 awk 完成,然后在后台运行 zip(如果 awk 以状态 0 退出)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-27
    • 2011-08-25
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    相关资源
    最近更新 更多