2010-08-14 4 views
3

Я использую curl и php для получения информации о заданном URL-адресе (например, код состояния http, mimetype, местоположение перенаправления http, название страницы и т. Д.).Предотвращение завивки, приводящего к фатальной ошибке для больших файлов

 
$ch = curl_init($url); 
$useragent="Mozilla/5.0 (X11; U; Linux x86_64; ga-GB) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.307.11 Safari/532.9"; 
curl_setopt($ch,CURLOPT_HTTPHEADER,array (
     "Accept: application/rdf+xml;q=0.9, application/json;q=0.6, application/xml;q=0.5, application/xhtml+xml;q=0.3, text/html;q=0.2, */*;q=0.1" 
    )); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$content=curl_exec($ch); 
$chinfo = curl_getinfo($ch); 
curl_close($ch); 

В целом это хорошо работает. Однако, если URL указывает на большой файл, то я получаю фатальную ошибку:

Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 14421576 bytes)

там так или иначе предотвратить это? Например, сообщая завиток, чтобы отказаться, если файл слишком велик, или поймав ошибку?

В качестве обходного пути, я добавил

curl_setopt ($ ч, CURLOPT_TIMEOUT, 3); , который предполагает, что любой файл, который загружается дольше 3 секунд, будет исчерпать допустимую память, но это далеко не удовлетворительно.

ответ

2

Вы пытались использовать CURLOPT_FILE, чтобы сохранить файл непосредственно на диск вместо использования памяти? Вы даже можете указать /dev/null, чтобы положить его в никуда ...

Или вы можете использовать CURLOPT_WRITEFUNCTION для настройки пользовательской функции записи данных. Попросите функцию просто отсканировать заголовки, а затем выбросить фактические данные.

В качестве альтернативы, дайте PHP дополнительную память через php.ini.

0

Если вы получаете информацию заголовка, то почему бы не использовать запрос HEAD? Это позволяет избежать использования памяти для получения всей страницы в максимальном слоте памяти 16 Мбайт.

curl_setopt($ch, CURLOPT_HEADER, true); 

Тогда для заголовка страницы, используйте file_get_contents() вместо этого, так как это намного лучше с родным выделением памяти.

+0

Первоначально я использовал это решение, но обнаружил, что некоторые веб-сайты (например, Amazon) не принимают запросы HEAD. – lucas