Я использую функцию PHP cURL для чтения профилей с steampowered.com. Полученные данные - это XML, и требуются только первые примерно 1000 байт.
Я использую метод добавления заголовка Range, который я прочитал в ответе на переполнение стека ( curl: Как ограничить размер 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.
Сервер не принимает во внимание заголовок диапазона. Лучшее, что вы можете сделать, - это отменить соединение, как только вы получите больше данных, чем хотите. Пример:
<?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 (она также использовала бы curl, если бы она была скомпилирована с помощью - with-curlwrappers
).Обычно вы вызываете fread
в цикле, а затем fclose
в потоке, когда получаете больше данных, чем вам нужно. Вы также можете использовать транспортный поток (открыть поток с помощью fsockopen
вместо fopen
и отправлять заголовки вручную), если allow_url_fopen
отключен.