我有一个过程密集型任务,我想在后台运行.
用户点击页面,运行PHP脚本,最后,根据某些条件,如果需要,则必须运行shell脚本,EG:
shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
Run Code Online (Sandbox Code Playgroud)
目前我使用shell_exec,但这需要脚本等待输出.有没有办法执行我想要的命令而不等待它完成?
jit*_*ter 144
如何添加.
"> /dev/null 2>/dev/null &"
shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');
Run Code Online (Sandbox Code Playgroud)
注意这也摆脱了stdio和stderr.
小智 27
这将执行命令并与正在运行的进程断开连接.当然,它可以是您想要的任何命令.但是对于测试,你可以使用sleep(20)命令创建一个php文件.
exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
Run Code Online (Sandbox Code Playgroud)
Oyt*_*tun 11
您还可以立即将输出返回给客户端,然后继续处理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.
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到详细说明:http://oytun.co/response-now-process-later
小智 8
在Windows 2003上,为了在不等待的情况下调用另一个脚本,我使用了这个:
$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg";
pclose(popen($commandString, 'r'));
Run Code Online (Sandbox Code Playgroud)
这只适用于更改权限后cmd.exe- 添加读取和执行IUSR_YOURMACHINE(我还设置写入拒绝).
小智 6
使用PHP的popen命令,例如:
pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
Run Code Online (Sandbox Code Playgroud)
这将创建一个子进程,脚本将在后台执行而无需等待输出.
当然可以,windows您可以使用:
$WshShell = new COM("WScript.Shell");
$oExec = $WshShell->Run("C:/path/to/php-win.exe -f C:/path/to/script.php", 0, false);
Run Code Online (Sandbox Code Playgroud)
注意:
如果遇到COM错误,请将扩展名添加到您的扩展名php.ini并重新启动apache:
[COM_DOT_NET]
extension=php_com_dotnet.dll
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
100754 次 |
| 最近记录: |