Захват прогресса из командной строки - PullRequest
1 голос
/ 14 июля 2009

% Всего% полученных% Xferd Средняя скорость Время Время Текущий Dload Upload Всего отработанных левых скоростей 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 Средняя скорость Время Время Время Текущий

Поля: Загрузка линейной нагрузки Всего отработанных левых скоростей

Поля: Линия 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 ]

1 голос
/ 14 июля 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);
1 голос
/ 14 июля 2009

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...