Возможно ли частично загрузить удаленный файл с помощью cURL? Скажем, фактический размер файла удаленного файла составляет 1000 КБ. Как загрузить только первые 500 КБ?
Как частично загрузить удаленный файл с помощью cURL?
Ответ 1
Вы также можете установить параметр заголовка диапазона с расширением php-curl.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.spiegel.de/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
curl_close($ch);
echo $result;
Но как отмечалось ранее, если сервер не соблюдает этот заголовок, но отправляет весь файл curl, он будет загружать все его содержимое. Например. http://www.php.net игнорирует заголовок. Но вы можете (дополнительно) установить обратный вызов функции записи и прервать запрос при получении большего количества данных, например.
// php 5.3+ only
// use function writefn($ch, $chunk) { ... } for earlier versions
$writefn = function($ch, $chunk) {
static $data='';
static $limit = 500; // 500 bytes, it only a test
$len = strlen($data) + strlen($chunk);
if ($len >= $limit ) {
$data .= substr($chunk, 0, $limit-strlen($data));
echo strlen($data) , ' ', $data;
return -1;
}
$data .= $chunk;
return strlen($chunk);
};
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.php.net/');
curl_setopt($ch, CURLOPT_RANGE, '0-500');
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
$result = curl_exec($ch);
curl_close($ch);
Ответ 2
Получить первые 100 байтов документа:
curl -r 0-99 http://www.get.this
из руководства
убедитесь, что у вас есть современный завиток
Ответ 3
Это может быть ваше решение (скачайте сначала 500 КБ в output.txt)
curl -r 0-511999 http://www.yourwebsite.com > output.txt
- while
511999
500^1024-1
Ответ 4
Спасибо за хорошее решение VolkerK. Однако мне нужно было использовать этот код как функцию, поэтому вот что я придумал. Надеюсь, это полезно для других. Основное отличие: use ($ limit, & $datadump), поэтому предел можно передать и использовать переменную $datadump для сравнения, чтобы иметь возможность вернуть ее в результате. Я также добавил CURLOPT_USERAGENT, потому что некоторые веб-сайты не разрешают доступ без заголовка пользовательского агента.
Проверить http://php.net/manual/en/functions.anonymous.php
function curl_get_contents_partial($url, $limit) {
$writefn = function($ch, $chunk) use ($limit, &$datadump) {
static $data = '';
$len = strlen($data) + strlen($chunk);
if ($len >= $limit) {
$data .= substr($chunk, 0, $limit - strlen($data));
$datadump = $data;
return -1;
}
$data .= $chunk;
return strlen($chunk);
};
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
//curl_setopt($ch, CURLOPT_RANGE, '0-1000'); //not honored by many sites, maybe just remove it altogether.
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($ch, CURLOPT_WRITEFUNCTION, $writefn);
$data = curl_exec($ch);
curl_close($ch);
return $datadump;
}
использование:
$page = curl_get_contents_partial ('http://some.webpage.com', 1000);//читаем первые 1000 байт
echo $page//или делать что-либо с результатом.