我有一个过程密集型的任务,希望能在后台运行。
用户点击页面,PHP脚本运行,最后根据某些条件,如果需要,则必须运行shell脚本,例如:
shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
我目前使用shell_exec, 但是这需要脚本等待输出。有没有方法可以执行我想要的命令而不必等待其完成?
我有一个过程密集型的任务,希望能在后台运行。
用户点击页面,PHP脚本运行,最后根据某些条件,如果需要,则必须运行shell脚本,例如:
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。> /dev/null 2>&1 &
是 > /dev/null 2>/dev/null &
的简洁形式。这基本上是说“将标准错误(2)重定向到与标准输出(&1)相同的地方”。 - rymo这将执行一个命令并断开与正在运行的进程的连接。当然,它可以是任何你想要的命令。但为了测试,你可以创建一个带有 sleep(20) 命令的 PHP 文件。
exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
nohup
和 &
? - bugmenot123你还可以立即将输出返回给客户端,并在此之后继续处理你的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.
您可以在此处找到详细的解释:http://oytun.co/response-now-process-later
$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg";
pclose(popen($commandString, 'r'));
只有在更改cmd.exe
的权限后才能正常工作 - 为IUSR_YOURMACHINE
添加读取和执行权限(我还将写入权限设置为拒绝)。
popen
命令,例如:pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
start /B php wait.php args
- bobble bubblewindows
系统您可以使用以下方式:$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
$oExec = $WshShell->Run('C:\Users\Shreyash\Desktop\phantomjs-2.1.1-windows\bin\phantomjs.exe -f C:\xampp\htdocs\composer\test_0.js', 0, false);
- GeekWithGlassespcntl_fork()
和exec()
,这是不好的做法。这样做是可行的,但您必须小心,不要过载服务器,因为每次调用此函数都会创建一个在后台运行的新进程。如果同时只有一个并发调用,则此解决方法将完成工作。
如果不是这样,我建议运行消息队列,例如beanstalkd/gearman/amazon sqs。