Вопрос

Есть ли способ ограничить объем данных, которые будет получать CURL?Я считываю данные со страницы размером 50 КБ, однако нужные мне данные находятся в верхней четверти страницы, поэтому мне действительно нужно получить только первые 10 КБ страницы.

Я спрашиваю, потому что мне нужно отслеживать много данных, в результате чего я передаю около 60 ГБ данных в месяц, тогда как актуально только около 5 ГБ этой пропускной способности.

Я использую PHP для обработки данных, однако у меня гибкий подход к получению данных: я могу использовать CURL, WGET, fopen и т. д.

Один из подходов, который я рассматриваю, это

$fp = fopen("http://www.website.com","r");
fseek($fp,5000);
$data_to_parse = fread($fp,6000);

Означает ли вышесказанное, что я перенесу только 6 КБ с www.website.com или fopen загрузит www.website.com в память, что означает, что я все равно перенесу полные 50 КБ?

Это было полезно?

Решение

Возможно, вы также сможете добиться того, что ищете, используя CURL.

Если вы посмотрите документацию для CURLOPT_WRITEFUNCTION вы можете зарегистрировать обратный вызов, который вызывается всякий раз, когда данные доступны для чтения из CURL.Затем вы можете подсчитать полученные байты, и когда вы получите более 6000 байт, вы можете вернуть 0, чтобы прервать остальную часть передачи.

А библиотека libcurl документация описывает обратный вызов немного подробнее:

Эта функция вызывается Libcurl, как только получаются данные, которые необходимо сохранить.Вернуть количество байтов, которые фактически позаботятся.Если эта сумма отличается от суммы, передаваемой вашей функции, она будет сигнализировать об ошибке библиотеке, и она прервет передачу и вернет curle_write_error.

Функция обратного вызова будет передаваться как можно больше данных во всех вызовах, но вы не можете сделать какие -либо предположения.Это может быть один байт, это могут быть тысячи.

Другие советы

На самом деле это скорее вопрос HTTP, чем вопрос CURL.

Как вы догадались, если вы используете fopen, будет загружена вся страница.Неважно, ищете ли вы по смещению 5000 или нет.

Лучший способ добиться того, чего вы хотите, — использовать частичный запрос HTTP GET, как указано в HTML RFC (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html):

Семантика изменения метода GET на «частичное получение», если сообщение запроса включает в себя поле заголовка диапазона.Частичные запросы на получение передачи, которые были переданы только частью организации, как описано в разделе 14.35.Метод частичного получения предназначен для сокращения ненужного использования сети, позволяя частично подъехать объекты без передачи данных, уже удерживаемых клиентом.

Подробности частичных запросов GET с использованием диапазонов описаны здесь:http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2

попробуй HTTP-запрос RANGE:

GET /largefile.html HTTP/1.1
Range: bytes=0-6000

если сервер поддерживает запросы диапазона, он вернет код ответа 206 Partial Content с заголовком Content-Range и запрошенным вами диапазоном байтов (если это не так, он вернет 200 и весь файл).видеть http://benramsey.com/archives/206-partial-content-and-range-requests/ за хорошее объяснение запросов диапазона.

смотрите также Возобновляемая загрузка при использовании PHP для отправки файла?.

Он загрузит всю страницу с fopen вызов, но тогда он прочитает только 6 КБ с этой страницы.

Из руководства PHP:

Чтение прекращается, как только выполняется одно из следующих условий:

  • длина байты были прочитаны
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top