% Всего% Получено% 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 }
в$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 Средняя скорость Время Время Время Текущее
Поля: линейная загрузка Dload Общая потерянная левая скорость
Поля: Строка 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 может сделать это сам по себе – хм задаст вопрос по этому поводу.
Прогресс, который появляется, вероятно, обновляет информацию в том же месте, так что это поможет, если вы точно поймете, что вы разбираете.
Следующим шагом, который я рекомендую, является использование одной строки ввода и попытка заставить regexp работать над этим.
Вы также можете просто разбить строку на пробелы, если я правильно прочитаю вывод. Если вы начинаете, заменив все двойные пробелы на один. После этого вы можете использовать explode (), чтобы получить массив со значениями, которые вы можете напечатать_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
Пока упорядочение в полях остается неизменным, ваш результирующий массив должен дать вам последовательный результат.
Надеюсь это поможет!
Если у вас есть доступ к 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);