有没有办法使用shell_exec而不等待命令完成?

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

用户点击一个页面,运行PHP脚本,最后,根据需要根据一些条件运行一个shell脚本EG:

shell_exec('php measurePerformance.php 47 844 email@yahoo.com'); 

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

如何添加。

 "> /dev/null 2>/dev/null &" shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &'); 

注意这也摆脱了stdio和stderr。

这将执行一个命令,并断开正在运行的进程。 当然,它可以是任何你想要的命令。 但是为了testing,你可以使用sleep(20)命令创build一个php文件。

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

您也可以立即将您的输出提交给客户端,然后继续处理您的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. 

你可以在这里find详细的解释: http : //oytun.co/response-now-process-later

在Windows 2003上,不用等待就可以调用另一个脚本,我使用了这个:

 $commandString = "start /bc:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg"; pclose(popen($commandString, 'r')); 

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

使用PHP的popen命令,例如:

 pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r")); 

这将创build一个subprocess,脚本将在后台执行,而不等待输出。

这将工作,但你将不得不小心不要超载你的服务器,因为它会创build一个新的进程,每次你调用这个函数将在后台运行。 如果同时只有一个并发呼叫,则此解决方法将执行此项工作。

如果没有,那么我会build议运行一个消息队列,比如beanstalkd / gearman / amazon sqs。

如果它离开了一个网页,我build议生成某种types的信号(可能是在一个目录中删除一个文件),并且有一个cron作业来完成需要完成的工作。 否则,我们很可能会从Apache进程中使用pcntl_fork()exec() ,这就是糟糕的魔咒。

对于你可以使用的windows

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

注意:

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

 [COM_DOT_NET] extension=php_com_dotnet.dll 

您总是可以将一些AJAX发布到调用shell_exec()的页面上。