Захватить прогресс из командной строки

% Всего% Получено% Xferd Средняя скорость Время Время Время Текущая загрузка загрузки Всего затрачено Оставшаяся скорость 100 12,4 млн 100 12,4 млн 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 Средняя скорость Время Время Время Текущее

Поля: Общая израсходованная оставшаяся скорость при загрузке линии

Поля: Строка 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 сможет это сделать сам - хм, задам вопрос по этому поводу.


person Abs    schedule 14.07.2009    source источник
comment
Хм, я только что заметил, что процент - это первое во второй строке, как мне это получить?   -  person Abs    schedule 14.07.2009


Ответы (2)


Наблюдаемый прогресс, вероятно, обновляет информацию в том же месте, поэтому вам поможет, если вы точно знаете, что анализируете.

Следующим шагом, который я рекомендую, является ввод одной строки и попытка заставить регулярное выражение работать с этим.

Вы также можете просто разделить строку на пробелы, если я правильно читаю вывод. Если вы начнете с замены всех двойных пробелов в один. После этого вы можете использовать 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

Пока порядок в полях остается неизменным, полученный массив должен давать согласованный результат.

Надеюсь это поможет!

person ylebre    schedule 14.07.2009
comment
Ах! Это похоже на то, что я могу понять. :) Спасибо вам за разъяснение. Я попробовал, и мне удалось получить результат выше (обновленный вопрос) - кажется, что отображаются обе строки, но не процентная часть. В любом случае, я могу редактировать это дальше? Спасибо. - person Abs; 15.07.2009
comment
Если массив заполнен, как я надеюсь, вы сможете получить доступ к процентному полю в $ fields [1]. - person ylebre; 15.07.2009

Если у вас есть доступ к 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);
person Edward Dale    schedule 14.07.2009