我有一个命令需要运行,但我不希望PHP等待结果。
<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>
有没有可能让PHP不等待结果,即只是启动它并继续执行下一个命令。
我找不到任何相关的信息,也不确定是否可能。最好的方法可能是创建一个在一分钟后启动的CRON作业。
根据文档:
为了执行一个命令并且不会在运行时挂起你的PHP脚本,你运行的程序必须不向PHP输出。为此,请将stdout和stderr都重定向到/dev/null,然后将其放入后台。
> /dev/null 2>&1 &
为了执行一个命令并将其作为另一个进程启动,该进程不依赖于Apache线程来保持运行(如果有人取消页面,它不会死亡),请运行以下命令:
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
stdin
也移植到/dev/null
?进程的输入被链接到shell是否足以阻止nohup
“放弃”子进程?(在此答案中,他们确实更改了stdin
:http://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely) - NHDalynohup
和setsid
?我找不到太多关于哪个更好或它们之间有何不同的信息。 - NHDaly你可以在命令的末尾添加&
将其放在后台运行,例如:
exec('run_baby_run &');
但仅仅这样做会使你的脚本挂起,因为:
如果使用exec函数启动程序,在程序继续在后台运行的情况下,必须将程序输出重定向到文件或另一个输出流中。未能这样做将导致PHP挂起,直到程序执行结束。
因此,你可以将命令的标准输出重定向到文件,以便稍后查看,或者重定向到/dev/null
以将其丢弃,例如:
exec('run_baby_run > /dev/null &');
这使用wget向URL发送通知,无需等待。
$command = 'wget -qO- http://test.com/data=data';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
使用"ls"命令更新日志,无需等待。
$command = 'ls -la > content.log';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
2>&1
和 echo
之间漏掉了一个 &
符号,我说的对吗? - santiago arizti我知道这个问题已经被解答了,但是我在这里找到的答案对我的情况(或者对于Windows)无效。
我正在使用安装有PHP 7.2的Xampp v3.2.4的Windows 10笔记本电脑。
$command = 'php Cron.php send_email "'. $id .'"';
if ( substr(php_uname(), 0, 7) == "Windows" )
{
//windows
pclose(popen("start /B " . $command . " 1> temp/update_log 2>&1 &", "r"));
}
else
{
//linux
shell_exec( $command . " > /dev/null 2>&1 &" );
}
pclose(popen("start /B " . $command . " 1> NUL 2>&1 &", "r"));
而不是:
pclose(popen("start /B " . $command . " 1> temp/update_log 2>&1 &", "r"));
它可以正常工作。 - Nikhil Sinhaexec("run_baby_run > /dev/null 2>&1 &");
但是,如果您有其他操作需要执行,您可以考虑使用ignore_user_abort函数。
在使用该函数的情况下,即使您关闭连接,脚本仍将运行。
在Windows上,您可以使用COM对象:
if(class_exists('COM')) {
$shell = new COM('WScript.Shell');
$shell->Run($cmd, 1, false);
}
else {
exec('nohup ' . $cmd . ' 2>&1 &');
}