PHP exec()作为后台进程(Windows Wampserver环境)

时间:2011-03-20 07:25:46

标签: php exec background-process

我正在尝试设置一个将触发后台进程的php触发器文件。 (见this question

我在Windows Wampserver环境中这样做。

例如,我有trigger.php运行exec函数,该函数调用我的backgroundProcess.php进行解析和执行。

但问题是我的trigger.php文件正在等待exec()命令在停止之前完成backgroundProcess.php运行。后台进程运行大约20-30秒,trigger.php等待所有时间,直到backgroundProcess.php完全结束。

这有意义吗?以下是运行trigger.php命令

exec()文件
exec('C:\wamp\bin\php\php'.phpversion().'\php.exe -f C:\path\to\backgroundProcess.php > C:\wamp\bin\php\php'.phpversion().'\dev\null &');

基本上,我希望trigger.php只是触发backgroundProcess,而不是等待它完成。


修改

使用以下命令解决问题:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);

6 个答案:

答案 0 :(得分:25)

使用以下命令解决问题:

$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:\wamp\bin\php\phpVERSIONNUMBER\php-win.exe -f C:/wamp/www/path/to/backgroundProcess.php", 0, false);

答案 1 :(得分:9)

试图在PHP 5.2.8的Windows 2000服务器上实现相同的目标。

这些解决方案都不适合我。 PHP一直在等待响应。

找到解决方案:

$cmd = "E:\PHP_folder_path\php.exe E:\some_folder_path\backgroundProcess.php";
pclose(popen("start /B ". $cmd, "a"));  // mode = "a" since I had some logs to edit

ps: 将相同的回复发布到另一个帖子(PHP on a windows machine; Start process in background),因为这两个链接帮助我做了很多研究。

答案 2 :(得分:4)

来自手册:http://www.php.net/manual/en/function.exec.php

  

注意:

     

如果程序以此启动   功能,以便继续   在后台运行,输出   该程序必须重定向到一个   文件或其他输出流。失败   这样做会导致PHP挂起,直到   程序的执行结束。

我回答了类似的问题:Call another PHP script and return control to user before the other script completes

答案 3 :(得分:3)

您可能需要更改实施方法。等待这么长时间对您的应用程序用户来说是一个烦恼,对整个应用程序来说都是致命的。

对于此类任务,通常最好将任务排队,最好是在数据库上,并定期处理它们。在基于Linux的系统上有chron作业。在Windows中,您可以使用调度程序启动backgroundProcess.php。

答案 4 :(得分:1)

在Windows环境中使用exec()时,重定向可能是NUL:/dev/null是* nix null文件。

答案 5 :(得分:0)

除了上面的Rohit的回答,我编辑了他的解决方案,以便在Windows 10 PHP 7.0.3上工作:

{{1}}