Есть ли способ ограничить объем данных CURL? Я очищаю данные экрана со страницы размером 50 КБ, однако требуемые данные находятся в верхней части 1/4 страницы, поэтому мне действительно нужно только получить первые 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 или будет загружать сайт 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 изменяется на «частичное GET», если сообщение запроса содержит поле заголовка Range. Частичные запросы GET передают только часть объекта, как описано в разделе 14.35. Частичный метод GET предназначен для уменьшения ненужного использования сети, позволяя завершить частично восстановленные объекты без передачи данных, уже находящихся у клиента.
Подробности частичных запросов 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
, но тогда он будет читать только 6kb с этой страницы.
Из руководства по PHP:
Чтение останавливается, как только выполняется одно из следующих условий:
- были прочитаны байты длины