php exec命令(或类似的)不等待结果

时间:2010-09-29 06:52:53

标签: php exec

我有一个我想要运行的命令,但我不希望PHP等待结果。

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

是否有可能让PHP不等待结果...即,将其踢开然后移动到下一个命令。

我找不到任何东西,也不确定它是否可能。我能找到的最好的是有人在一分钟内开始CRON工作。

7 个答案:

答案 0 :(得分:102)

来自documentation

  

为了执行一个命令,让它不要挂起你的PHP脚本   它运行,你运行的程序不能输出回PHP。去做这个,   将stdout和stderr重定向到/ dev / null,然后将其重新定位。

     

&GT; /dev/null 2>&1 &

     

为了执行命令而拥有   它产生了另一个过程   不依赖于apache线程   继续跑(如果不会死   有人取消页面)运行这个:

     

exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');

答案 1 :(得分:45)

您可以在后台添加&作为后台运行命令:

exec('run_baby_run &');

但单独执行此操作会挂起您的脚本,因为:

  

如果程序是使用exec函数启动的,为了使程序继续在后台运行,必须将程序的输出重定向到文件或其他输出流。如果不这样做将导致PHP挂起,直到程序执行结束。

因此,您可以将命令的标准输出重定向到文件,如果您想稍后查看,或者如果要将其丢弃为/dev/null,则可以将其重定向到:{/ p>

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

答案 2 :(得分:7)

这使用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 :(得分:0)

  
    

“exec nohup setsid your_command”

  

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

答案 4 :(得分:0)

有两种方法可以实现它。 最简单的方法是直接将结果发送到dev / null

exec("run_baby_run > /dev/null 2>&1 &");

但是,如果您要执行其他任何操作,则可以考虑使用ignore_user_abort 在这种情况下,即使关闭连接,脚本仍将运行。

答案 5 :(得分:0)

我知道这个问题已经回答了,但是我在这里找到的答案不适用于我的情况(或Windows)。

我正在Xampp v3.2.4中使用Windows 10笔记本电脑和PHP 7.2。

$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 &" );
}

这对我来说很好。

我希望它将对使用Windows的人有所帮助。干杯。

答案 6 :(得分:0)

在 Windows 上,您可以使用 COM 对象:

if(class_exists('COM')) {
    $shell = new COM('WScript.Shell');
    $shell->Run($cmd, 1, false);
}
else {
    exec('nohup ' . $cmd . ' 2>&1 &');
}