PHP exec()不返回

PHP exec()不返回,php,Php,我正在编写一个PHP脚本,它将在服务器上启动一个程序 我是这样做的: exec('myAppName'); 这一行代码“有效”,因为它实际上执行程序,但是,我不能让它从这一行返回(继续过去) 它将一直挂在那里,直到我手动关闭打开的程序或超过最大执行时间 我是否遗漏了一些明显的内容?虽然对于等待启动的程序退出的问题并不完全清楚,但声明返回值为 返回值:命令结果的最后一行 换句话说,正如您所观察到的,为了返回最后一行输出,exec将在启动的程序退出之前不会返回。您需要对其进行背景设置,以便继续使用

我正在编写一个PHP脚本,它将在服务器上启动一个程序

我是这样做的:

exec('myAppName');
这一行代码“有效”,因为它实际上执行程序,但是,我不能让它从这一行返回(继续过去)

它将一直挂在那里,直到我手动关闭打开的程序或超过最大执行时间

我是否遗漏了一些明显的内容?

虽然对于等待启动的程序退出的问题并不完全清楚,但声明返回值为

返回值:命令结果的最后一行


换句话说,正如您所观察到的,为了返回最后一行输出,
exec
将在启动的程序退出之前不会返回。

您需要对其进行背景设置,以便继续使用我认为剩余的php

在Unix/Linux中,使用“&”字符


嗯,或者说是这样的系统。。该死,现在记不起来了-我会再去阅读手册。

要在PHP中为流程添加背景,您需要执行以下操作:

function spawnBackgroundProcess($sProcessLine)
{
    $aPipes = array();

    $rProcess = proc_open($sProcessLine, array(), $aPipes);
    proc_close($rProcess);
}
这真的是在虐待proc_u*家族,但不幸的是,这是最好的方式


(不要忘记&!)

如果希望在后台执行命令而不让脚本等待结果,可以执行以下操作:

<?php
passthru("/usr/bin/php /path/to/script.php ".$argv_parameter." >> /path/to/log_file.log        2>&1 &");
?>

这里有几件事很重要

首先:将完整路径放在php二进制文件中,因为此命令将在apache用户下运行,并且您可能不会在该用户中设置类似php的命令别名

second:注意命令字符串末尾的两件事:“2>&1”和“&”。“2>&1”用于将错误重定向到标准IO。最重要的是命令字符串末尾的“&”,它告诉终端不要等待响应

第三:确保您对“log_file.log”文件拥有777个权限


享受吧

您是想
fork
然后
exec
?因为
exec
不应该以某种方式“背景”该过程。在黑暗中拍摄,但尝试使用而不是
exec()
。程序的输出可能会显示一些信息。我也尝试了passthru(),但结果相同。我应该声明我正在Windows服务器上运行PHP。无论如何,我使用了一个名为“PsExec”的工具来启动进程,而不是等待它。exec(“psexec-d myAppName”);这似乎完成了我需要的。亚当,你可以在Windows上完成,而不需要任何外部程序:我应该在原始帖子中声明,但我在Windows服务器上。