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

gre*_*reg 67 php exec

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

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

有没有可能让PHP不等待结果..即只是启动它并移动到下一个命令.

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

Cri*_*ian 113

检查文档总是好的:

为了执行一个命令让它在运行时不挂起你的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&gt; / dev / null 2&gt;&1&')就足够了。 (2认同)

cod*_*ict 48

您可以在后台运行命令,&在其末尾添加a :

exec('run_baby_run &');
Run Code Online (Sandbox Code Playgroud)

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

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

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

exec('run_baby_run > /dev/null &');
Run Code Online (Sandbox Code Playgroud)


Ani*_*nil 9

我知道这个问题已经得到解答,但我在这里找到的答案不适用于我的场景(或 Windows)。

我正在使用 Windows 10 笔记本电脑和 Xampp v3.2.4 中的 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 &" );
}
Run Code Online (Sandbox Code Playgroud)

这对我来说非常有效。

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


小智 8

这使用wget在不等待的情况下通知URL.

$command = 'wget -qO- http://test.com/data=data';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
Run Code Online (Sandbox Code Playgroud)

这使用ls来更新日志而无需等待.

$command = 'ls -la > content.log';
exec('nohup ' . $command . ' >> /dev/null 2>&1 & echo $!', $pid);
Run Code Online (Sandbox Code Playgroud)

  • 我想你错过了`2>&1`和`echo`之间的`&`符号,对不对? (3认同)
  • 如果父母被杀,nohup是否也让孩子继续跑步? (2认同)