有没有办法使用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()的页面上。