2011-03-20 85 views
24

我试图设置一个php触发器文件,它将引发一个后台进程。 (请参见this questionPHP exec()作为后台进程(Windows Wampserver环境)

我在Windows Wampserver环境中执行此操作。

因此,例如我有trigger.php运行执行功能,调用我的backgroundProcess.php进行分析和执行。

但问题是我的trigger.php文件正在等待exec()命令在停止之前完成运行backgroundProcess.php。后台进程运行大约20-30秒,并且trigger.php一直在等待,直到backgroundProcess.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文件,我想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); 
+0

这已经导致以随机方式的问题给我。抛出关于无法运行命令的例外。检查我的答案。 – 2013-09-02 11:16:57

+0

什么是在文件backgroundProcess.php? – user3120717 2013-12-29 07:18:11

回答

23

问题用下面的命令来解决:

$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); 
+0

这对我来说是一个随机的问题。抛出关于无法运行命令的例外。检查我的答案。 – 2013-09-02 11:16:30

+1

@Muhammad Gelbana你没有在这个问题上的答案..关心是更具体还是链接到你所指的答案? – computrius 2014-02-13 20:23:38

+2

它被删除了!任何方式,这里是我写的 exec(“CMD/C在这里启动你的命令”)的总结; 我认为/ C参数开关不是必需的,但我只是非常确定。 如果要在脚本的当前目录中执行,请用dirname(__ FILE__)前缀命令。 这只能在Windows计算机上存在启动命令时才能起作用。 – 2014-02-13 23:11:02

3

您可能需要改变你的实现方法。不得不等待这么长的时间对你的应用程序的用户来说是一个烦恼,并且对整个应用程序是致命的。

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

+1

这不是可以排队的东西。这是一个ssh连接到远程服务器并处理一些事情。 – Emmanuel 2011-03-20 07:34:40

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

+0

@JohnP - 是的,但我认为我是用'> C:\ wamp \ bin \ php \ php'.phpversion()。'\ dev \ null& – Emmanuel 2011-03-20 08:27:48

+0

我想你需要创建一个文件描述符并将其作为第二个参数传入。不只是管它。 – JohnP 2011-03-20 08:39:54

+0

@JohnP - 我之前没有听说过一个文件描述符......至少不是那个术语。你能举个简单的例子吗? – Emmanuel 2011-03-20 08:41:38

1

这很可能是在Windows环境中使用exec()时重定向到NUL:/dev/null是一个* nix空文件。

10

试图在使用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个链接帮了我很多做一些这方面的研究同样的答复。

+0

我发现这种方法在Win7上运行PHP 5.4 – JoshuaDavid 2015-01-02 09:05:05

0

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

pclose(popen("start /B ". $cmd, "w"));