在 PHP 中运行 exec("nohup curl ...") 并重定向 stderr

问题描述 投票:0回答:1

我有一段使用 exec() 函数执行多个curl 请求的php 代码。目标是同时下载大量文件,同时跟踪 PID 和进度。简化版是这样的:

<?php
// some code here
unset($pid);
for($i=1;$i<=100;$i++) {
    exec("nohup curl '".$url[$i]."' -o output-".$i.".dat > log/".$i.".log & echo $!",$pid[$i]);
}
// some code here
?>

哪里

$url[]
是一个包含很多url的数组

$pid[]
是一个包含curl进程PID的数组。我需要它来检查该过程是否完成,然后执行其他任务。

 output-i.dat
是下载的文件

 log/i.log
是一个文本文件,包含cli中curl生成的过程。我需要这个来确保文件已 100% 下载并且连接不会中途丢失

我需要使用

nohup
的原因是为了获取PID,没有
nohup
我无法从
echo $!

获取PID

这个脚本可以工作并实现我所需要的效果,但是当我在 cli 中运行代码时

php download.php
屏幕将充满

nohup: redirecting stderr to stdout
nohup: redirecting stderr to stdout
......
nohup: redirecting stderr to stdout
nohup: redirecting stderr to stdout

我想知道是否有办法将此输出通过管道传输到

/dev/null

我尝试像这样在 php 中包含

> /dev/null 2>&1

exec("nohup curl '".$url[$i]."' -o output-".$i.".dat > log/".$i.".log > /dev/null 2>&1 & echo $!",$pid[$i]);

但它不起作用。这也行不通:

exec("nohup curl '".$url[$i]."' -o output-".$i.".dat > log/".$i.".log 2>/dev/null & echo $!",$pid[$i]);

我希望有一个安静的开关

nohup
但它似乎没有。

php curl exec stderr nohup
1个回答
0
投票

这会获取 PID、输出并隐藏

nohup: redirecting stderr to stdout
消息:


$o = array();
$output = exec("nohup curl -h 2> /dev/null & echo $!", $o);

$pid = $o[0];

这会获取 PID,将状态写入日志文件并隐藏 nohup 消息:


$o = array();
exec("nohup curl -h > log.log 2> /dev/null & echo $!", $o);

$pid = $o[0];

这会获取 PID,将输出写入文件,记录状态并隐藏 nohup 消息:


$o = array();
exec("nohup curl example.com -o output --stderr log.log 2> /dev/null & echo $!", $o);

$pid = $o[0];
© www.soinside.com 2019 - 2024. All rights reserved.