2009-10-08 6 views
2

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

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

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

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

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

Означает ли это, что я передам только 6 килобайт с сайта www.website.com или открою загрузку сайта www.website.com в память, что я все равно передам полный 50 кб?

ответ

2

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

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

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

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

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

+0

Я отметил это как принятый ответ, поскольку он более надежный, чем запрос диапазона HTTP, который может не всегда поддерживаться, и я могу отметить только один ответ. – James

0

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

Из PHP инструкции:

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

  • длина байт было прочитано
4

Это скорее HTTP, чем вопрос CURL.

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

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

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

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

3

HTTP RANGE request попробовать:

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

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

см. Также Resumable downloads when using PHP to send the file?.