有没有办法在不等待命令完成的情况下使用shell_exec?

Tou*_*Pal 90 php shell

我有一个过程密集型任务,我想在后台运行.

用户点击页面,运行PHP脚本,最后,根据某些条件,如果需要,则必须运行shell脚本,EG:

shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
Run Code Online (Sandbox Code Playgroud)

目前我使用shell_exec,但这需要脚本等待输出.有没有办法执行我想要的命令而不等待它完成?

jit*_*ter 144

如何添加.

"> /dev/null 2>/dev/null &"

shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');
Run Code Online (Sandbox Code Playgroud)

注意这也摆脱了stdio和stderr.

  • 是丢弃了.是火,忘了 (5认同)
  • 注意:`>/dev/null 2>&1&`在其他答案中看到的是`>/dev/null 2>/dev/null&`的简洁形式.这基本上是说"将STDERR(2)重定向到与STDOUT(&1)相同的位置". (3认同)
  • 我通常通过添加echo $获得运行脚本的PID!>> /tmp/pid.txt在exec命令的末尾但是通过将输出和错误重定向到/ dev/null,没有更多的pid文件:你们中的任何人都可以在不等待输出的情况下获得exec启动的脚本的PID吗? (3认同)
  • 没有副作用.如果您某个时候决定要进行流程的stdio或stderr输出,请考虑http://stackoverflow.com/questions/45953/php-execute-a-background-process/45966#45966 (2认同)

小智 27

这将执行命令并与正在运行的进程断开连接.当然,它可以是您想要的任何命令.但是对于测试,你可以使用sleep(20)命令创建一个php文件.

exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)


Oyt*_*tun 11

您还可以立即将输出返回给客户端,然后继续处理PHP代码.

这是我用于长时间等待Ajax调用的方法,它对客户端没有任何影响:

ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
// execute your command here. client will not wait for response, it already has one above.
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到详细说明:http://oytun.co/response-now-process-later

  • 这与 shell_exec *无关* (3认同)

小智 8

在Windows 2003上,为了在不等待的情况下调用另一个脚本,我使用了这个:

$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg"; 
pclose(popen($commandString, 'r'));
Run Code Online (Sandbox Code Playgroud)

这只适用于更改权限后cmd.exe- 添加读取和执行IUSR_YOURMACHINE(我还设置写入拒绝).


小智 6

使用PHP的popen命令,例如:

pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
Run Code Online (Sandbox Code Playgroud)

这将创建一个子进程,脚本将在后台执行而无需等待输出.

  • 它等待子进程结束.至少在Win上 (3认同)
  • 这在 win 10 上对我有用,不会弹出 cli 窗口:`start /B php wait.php args` (2认同)

Ped*_*ito 6

当然可以,windows您可以使用:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);
Run Code Online (Sandbox Code Playgroud)

注意:

如果遇到COM错误,请将扩展名添加到您的扩展名php.ini并重新启动apache

[COM_DOT_NET]
extension=php_com_dotnet.dll
Run Code Online (Sandbox Code Playgroud)