从命令行捕获进度

时间:2009-07-14 14:03:29

标签: php command-line curl

%收到的总百分比%Xferd平均速度时间时间当前时间                                      Dload上载总左转速度     100 12.4M 100 12.4M 0 0 4489k 0 0:00:02 0:00:02 - : - : - 4653k

以上是下载文件时命令行的CURL输出。我已经使用PHP捕获了这个,但我无法弄清楚如何使用pre_match来提取完成的百分比。

$handle = popen('curl -o '.VIDEOPATH.$fileName.'.flv '.$url, 'rb');

while(!feof($handle))
{
    $progress = fread($handle, 8192);
    //I don't even know what I was attempting here
    $pattern = '/(?<Total>[0-9]{1,3}\.[0-9]{1,2})% of (?<Total>.+) at/';
    //divide received by total somehow, then times 100
    if(preg_match_all($pattern, $progress, $matches)){
    fwrite($fh, $matches[0][0]."\r\n");
    }

} 

我该怎么做?请注意,我不知道我正在使用上面的preg_match_all做什么!

由于

更新

感谢ylebre的帮助。到目前为止,我有这个。

$handle = popen('curl -o '.VIDEOPATH.$fileName.'.flv '.$url.' 2>&1', 'rb');//make sure its saved to videos

while(!feof($handle))
{

    $line = fgets($handle, 4096); // Get a line from the input handle
    echo '<br>Line'.$line.'<br>';
    $line = preg_replace("/s+/", " ", $line); // replace the double spaces with one
    $fields = explode(" ", $line); // split the input on spaces into fields array
    echo '<br>Fields: '.$fields[0];
    fwrite($fh, $fields[0]); // write a part of the fields array to the output file

} 

我将此输出发送到浏览器:


行%累计接收%%Xferd平均速度时间时间当前时间

字段: Line Dload Upload Total Spent Left Speed

字段: 第0行1340k 0 4014 0 0 27342 0 0:00:50 - : - : - 0:00:50 27342 41 1340k 41 552k 0 0 849k 0 0:00:01 - : - : - 0 :00:01 1088k 100 1340k 100 1340k 0 0 1445k 0 - : - : - - : - : - - : - : - 1711k

字段: 线


如何仅提取百分比部分?也许CURL可以自己做 - 嗯会问这个问题。

2 个答案:

答案 0 :(得分:1)

显示的进度可能是在同一位置更新信息,因此如果您知道要解析的内容,将会有所帮助。

我建议的下一步是采取一行输入,并试图让regexp工作。

如果我正确读取输出,你也可以在空格处拆分字符串。如果你开始将所有双空格替换为一个。之后你可以使用explode()来获取一个包含值的数组,你可以通过print_r来查看里面的内容。

这就像是:

$line = fgets($handle, 4096); // Get a line from the input handle
$line = preg_replace("/s+/", " ", $line); // replace the double spaces with one
$fields = explode(" ", $line); // split the input on spaces into fields array
fwrite($fh, $fields[0]); // write a part of the fields array to the output file

只要字段中的顺序保持不变,结果数组就会给出一致的结果。

希望这有帮助!

答案 1 :(得分:1)

如果您可以访问PHP 5.3,则可以使用CURL_PROGRESSFUNCTION选项,这会产生更优雅的解决方案(无解析输出)。以下是如何使用它的示例:

function callback($download_size, $downloaded, $upload_size, $uploaded)
{
  $percent=$downloaded/$download_size;
  // Do something with $percent
}

$ch = curl_init('http://www.example.com');

// Turn off the default progress function
curl_setopt($ch, CURLOPT_NOPROGRESS, false);

// Set up the callback
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');

// You'll want to tweak the buffer size.  Too small could affect performance.  Too large and you don't get many progress callbacks.
curl_setopt($ch, CURLOPT_BUFFERSIZE, 128);

$data = curl_exec($ch);