我有一个命令要运行,但我不希望PHP坐着等待结果。
<?php echo "Starting Script"; exec('run_baby_run'); echo "Thanks, Script is running in background"; ?>
有没有可能让PHP不等待结果...也就是说,只是启动它,然后继续下一个命令。我找不到任何东西,也不确定它是否可能。我能找到的最好的是有人做一个CRON的工作在一分钟内开始。
omvjsjqw1#
从documentation:为了执行命令并使其在以下情况下不挂起PHP脚本它运行时,你运行的程序不能输出回PHP。要做到这一点,将stdout和stderr重定向到/dev/null,然后将其置于后台。> /dev/null 2>&1 &为了执行命令并使它衍生出另一个进程不依赖于Apache线程继续运行(不会死,如果某人取消页面)运行此:exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
> /dev/null 2>&1 &
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
ryevplcw2#
您可以通过在命令末尾添加&在后台运行该命令,如下所示:
&
exec('run_baby_run &');
但是单独这样做会挂起你的剧本,因为:如果一个程序是用exec函数启动的,为了让它继续在后台运行,必须将程序的输出重定向到一个文件或另一个输出流。如果不这样做,PHP将挂起,直到程序执行结束。因此,如果您想稍后查看该命令的stdout,则可以将其重定向到一个文件;如果您想将其丢弃,则可以将其重定向到/dev/null,如下所示:
/dev/null
exec('run_baby_run > /dev/null &');
hfyxw5xn3#
这个函数使用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);
9udxz4iz4#
我知道这个问题已经得到了回答,但是我在这里找到的答案对我的场景(或Windows)不起作用。我正在使用Windows 10笔记本电脑与PHP 7.2在Xampp v3.2.4.
$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的人有帮助干杯。
lfapxunr5#
有两种可能的方法来实现它,最简单的方法是直接将result写入dev/null
exec("run_baby_run > /dev/null 2>&1 &");
但如果您有任何其他操作要执行,您可以考虑ignore_user_abort在这种情况下,脚本将运行,即使在您关闭连接。
pgccezyw6#
“execnohupsetsid您的命令”
nohup允许your_command继续运行,即使启动的进程可能先终止。如果启动的进程先终止,SIGNUP信号将发送到your_command,导致其终止(除非捕获该信号并忽略它)。
vjhs03f77#
在Windows上,您可以使用COM对象:
if(class_exists('COM')) { $shell = new COM('WScript.Shell'); $shell->Run($cmd, 1, false); } else { exec('nohup ' . $cmd . ' 2>&1 &'); }
7条答案
按热度按时间omvjsjqw1#
从documentation:
为了执行命令并使其在以下情况下不挂起PHP脚本
它运行时,你运行的程序不能输出回PHP。要做到这一点,
将stdout和stderr重定向到/dev/null,然后将其置于后台。
> /dev/null 2>&1 &
为了执行命令并使
它衍生出另一个进程
不依赖于Apache线程
继续运行(不会死,如果
某人取消页面)运行此:
exec('bash -c "exec nohup setsid your_command > /dev/null 2>&1 &"');
ryevplcw2#
您可以通过在命令末尾添加
&
在后台运行该命令,如下所示:但是单独这样做会挂起你的剧本,因为:
如果一个程序是用exec函数启动的,为了让它继续在后台运行,必须将程序的输出重定向到一个文件或另一个输出流。如果不这样做,PHP将挂起,直到程序执行结束。
因此,如果您想稍后查看该命令的stdout,则可以将其重定向到一个文件;如果您想将其丢弃,则可以将其重定向到
/dev/null
,如下所示:hfyxw5xn3#
这个函数使用wget来通知某个URL,而无需等待。
它使用ls更新日志而无需等待。
9udxz4iz4#
我知道这个问题已经得到了回答,但是我在这里找到的答案对我的场景(或Windows)不起作用。
我正在使用Windows 10笔记本电脑与PHP 7.2在Xampp v3.2.4.
这对我来说太完美了。
希望对有Windows的人有帮助干杯。
lfapxunr5#
有两种可能的方法来实现它,最简单的方法是直接将result写入dev/null
但如果您有任何其他操作要执行,您可以考虑ignore_user_abort在这种情况下,脚本将运行,即使在您关闭连接。
pgccezyw6#
“execnohupsetsid您的命令”
nohup允许your_command继续运行,即使启动的进程可能先终止。如果启动的进程先终止,SIGNUP信号将发送到your_command,导致其终止(除非捕获该信号并忽略它)。
vjhs03f77#
在Windows上,您可以使用COM对象: