Я использую функцию PHP cURL для чтения профилей с сайта steampowered.com. Полученные данные представляют собой XML, и нужны только первые примерно 1000 байтов.
Метод, который я использую, заключается в добавлении заголовка Range, который я прочитал в ответ на переполнение стека ( завиток: как ограничить размер GET? ). Другой метод, который я пытался использовать, использовал curlopt_range, но это тоже не сработало.
<? $curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; $curl_handle = curl_init($curl_url); curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt ($curl_handle, CURLOPT_HTTPHEADER, array("Range: bytes=0-1000")); $data_string = curl_exec($curl_handle); echo $data_string; curl_close($curl_handle); ?>
Когда этот код выполняется, он возвращает все.
Я использую PHP версии 5.2.14.
Сервер не соблюдает заголовок Range. Лучшее, что вы можете сделать, это отменить соединение, как только вы получите больше данных, чем хотите. Пример:
<?php $curl_url = 'http://steamcommunity.com/id/edgen?xml=1'; $curl_handle = curl_init($curl_url); $data_string = ""; function write_function($handle, $data) { global $data_string; $data_string .= $data; if (strlen($data_string) > 1000) { return 0; } else return strlen($data); } curl_setopt ($curl_handle, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($curl_handle, CURLOPT_CONNECTTIMEOUT, 2); curl_setopt ($curl_handle, CURLOPT_WRITEFUNCTION, 'write_function'); curl_exec($curl_handle); echo $data_string;
Возможно, более чисто, вы можете использовать http-обертку (это также будет использовать завиток, если он был скомпилирован с --with-curlwrappers
). В принципе, вы должны вызывать fread
в цикле, а затем fclose
в потоке, когда вы получили больше данных, чем вы хотели. Вы также можете использовать транспортный поток (раскройте поток с помощью fsockopen
, вместо fopen
и отправьте заголовки вручную), если allow_url_fopen
отключен.