我有一段使用 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
但它似乎没有。
这会获取 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];