我有一个过程密集型任务,我想在后台运行。
用户单击页面,运行PHP脚本,最后,根据需要,根据某些条件,它必须运行shell脚本EG:
shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
当前,我使用shell_exec,但这需要脚本等待输出。有什么方法可以执行我想要的命令,而无需等待命令完成?
我有一个过程密集型任务,我想在后台运行。
用户单击页面,运行PHP脚本,最后,根据需要,根据某些条件,它必须运行shell脚本EG:
shell_exec('php measurePerformance.php 47 844 email@yahoo.com');
当前,我使用shell_exec,但这需要脚本等待输出。有什么方法可以执行我想要的命令,而无需等待命令完成?
Answers:
如何添加。
"> /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 &
此处给出的是简洁形式。这基本上是说“将STDERR(2)重定向到与STDOUT(&1)相同的位置”。
这将执行命令并与正在运行的进程断开连接。当然,它可以是您想要的任何命令。但是对于测试,您可以使用sleep(20)命令创建一个php文件。
exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");
nohup
和&
?
您还可以立即将输出返回给客户端,然后继续处理您的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
当然可以,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
使用PHP的popen
命令,例如:
pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));
这将创建一个子进程,脚本将在后台执行,而无需等待输出。