2010-09-29 340 views
49

我有一个命令我想运行,但我不想PHP坐下来等待结果。php exec命令(或类似的)不等待结果

<?php 
echo "Starting Script"; 
exec('run_baby_run'); 
echo "Thanks, Script is running in background"; 
?> 

有没有可能让PHP不等待结果..也就是说只是将它踢出去并移动到下一个命令。

我无法找到任何东西,并不确定它甚至可能。我能找到的最好的就是有人在一分钟内开始CRON工作。

+1

如果你经常这样做,你可能也会对[JobQueue,像Gearman]感兴趣(http://de2.php.net/manual/en/book.gearman.php)。 – Gordon 2010-09-29 07:15:45

回答

38

您可以通过它的结束,添加一个&在后台运行命令:

exec('run_baby_run &'); 

但这样做仅此将挂起你的脚本,因为:

如果程序是以exec函数开始,为了继续在后台运行,程序的输出必须被重定向到一个文件或另一个输出流。否则会导致PHP挂起,直到程序执行结束。

所以,你可以在命令的标准输出重定向到一个文件,如果你想以后还是/dev/null看到它,如果你想删除它,:

exec('run_baby_run > /dev/null &'); 
+0

工作很好,谢谢你的帮助。 – greg 2010-09-29 09:01:44

+0

谢谢,先生。这工作完美。 – 2013-11-24 21:51:26

+0

不重定向stderr,并被崩溃的web服务器杀死。 – 2017-10-19 11:26:18

80

这是一件好事,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 &"');

+0

非常感谢!有很多“解决方案”实际上并不工作(主浏览器线程仍在等待)。许多解决方案只在最后告诉“&”,这是不够的。这就是说,对我来说一个简单的解决方案:exec('nohup your_command>/dev/null 2>&1&')就足够了。 – 2013-06-27 08:41:02

+0

为什么你不需要将'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

+0

也是,你为什么同时调用' nohup'和'setsid'?我无法找到有关哪一个更好或他们是如何不同的更多信息..(http://stackoverflow.com/questions/10247721/on-writing-a-linux-shell-script-to-safely-detach-程序从终端) – NHDaly 2013-09-07 13:52:03

0

“EXEC 的nohup setsid your_command”

的nohup允许your_command继续即使是推出可先终止进程。如果是这样,SIGNUP信号将被发送到your_command,导致它终止(除非它捕获该信号并忽略它)。

+0

根据[此回答](https://stackoverflow.com/a/284443/819417),孩子必须注册SIGHUP以通知其父母的死亡。尽管如此,终端往往会在退出时发送HUP信号。 – 2017-10-19 12:12:59

6

好吧,这里是最后确定的正确获奖的答案;-)

它使用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); 
+3

我想你在'2>&1'和'echo'之间缺少一个'&'符号,对吗? – 2017-04-06 21:19:51

+0

如果父母死亡,nohup是否也让孩子继续奔跑? – 2017-10-19 11:27:39

+0

@santiagoarizti是的,我修正了它的代码不工作,否则 – 2017-11-30 09:08:19