我有一个命令我想运行,但我不想PHP坐下来等待结果。php exec命令(或类似的)不等待结果
<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>
有没有可能让PHP不等待结果..也就是说只是将它踢出去并移动到下一个命令。
我无法找到任何东西,并不确定它甚至可能。我能找到的最好的就是有人在一分钟内开始CRON工作。
我有一个命令我想运行,但我不想PHP坐下来等待结果。php exec命令(或类似的)不等待结果
<?php
echo "Starting Script";
exec('run_baby_run');
echo "Thanks, Script is running in background";
?>
有没有可能让PHP不等待结果..也就是说只是将它踢出去并移动到下一个命令。
我无法找到任何东西,并不确定它甚至可能。我能找到的最好的就是有人在一分钟内开始CRON工作。
您可以通过它的结束,添加一个&
在后台运行命令:
exec('run_baby_run &');
但这样做仅此将挂起你的脚本,因为:
如果程序是以exec函数开始,为了继续在后台运行,程序的输出必须被重定向到一个文件或另一个输出流。否则会导致PHP挂起,直到程序执行结束。
所以,你可以在命令的标准输出重定向到一个文件,如果你想以后还是/dev/null
看到它,如果你想删除它,:
exec('run_baby_run > /dev/null &');
工作很好,谢谢你的帮助。 – greg 2010-09-29 09:01:44
谢谢,先生。这工作完美。 – 2013-11-24 21:51:26
不重定向stderr,并被崩溃的web服务器杀死。 – 2017-10-19 11:26:18
这是一件好事,check the documentation:
为了执行命令有它不挂你的php脚本,而它运行 ,你运行的程序不能输出回到PHP。为此, 将stdout和stderr重定向到/ dev/null,然后将其背景化。
>
/dev/null 2>&1 &
为了执行命令,并具有 它产生了断作为另一个过程 不依赖apache的螺纹 保持运行上运行(如果 某人取消页不会死)这样的:
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
非常感谢!有很多“解决方案”实际上并不工作(主浏览器线程仍在等待)。许多解决方案只在最后告诉“&”,这是不够的。这就是说,对我来说一个简单的解决方案:exec('nohup your_command>/dev/null 2>&1&')就足够了。 – 2013-06-27 08:41:02
为什么你不需要将'stdin'移植到/ dev/null?将一个进程的输入连接到一个shell是否足以阻止'nohup'使得子进程“失效”? (他们确实在这个答案中改变了stdin:http://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely) – NHDaly 2013-09-07 13:43:46
也是,你为什么同时调用' nohup'和'setsid'?我无法找到有关哪一个更好或他们是如何不同的更多信息..(http://stackoverflow.com/questions/10247721/on-writing-a-linux-shell-script-to-safely-detach-程序从终端) – NHDaly 2013-09-07 13:52:03
“EXEC 的nohup setsid your_command”
的的nohup允许your_command继续即使是推出可先终止进程。如果是这样,SIGNUP信号将被发送到your_command,导致它终止(除非它捕获该信号并忽略它)。
根据[此回答](https://stackoverflow.com/a/284443/819417),孩子必须注册SIGHUP以通知其父母的死亡。尽管如此,终端往往会在退出时发送HUP信号。 – 2017-10-19 12:12:59
好吧,这里是最后确定的正确获奖的答案;-)
它使用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'之间缺少一个'&'符号,对吗? – 2017-04-06 21:19:51
如果父母死亡,nohup是否也让孩子继续奔跑? – 2017-10-19 11:27:39
@santiagoarizti是的,我修正了它的代码不工作,否则 – 2017-11-30 09:08:19
如果你经常这样做,你可能也会对[JobQueue,像Gearman]感兴趣(http://de2.php.net/manual/en/book.gearman.php)。 – Gordon 2010-09-29 07:15:45