%收到的总百分比%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可以自己做 - 嗯会问这个问题。
答案 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);