Предотвратить скручивание, генерирующее фатальную ошибку для больших файлов - PullRequest
3 голосов
/ 14 августа 2010

Я использую 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 указывает на файл большего размера, я получаю фатальную ошибку:

Неустранимая ошибка : допустимый объем памяти 16777216 байт исчерпан (попытался выделить 14421576 байт)

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

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

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

Ответы [ 2 ]

2 голосов
/ 14 августа 2010

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

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

Либо добавьте PHP больше памяти через php.ini.

0 голосов
/ 14 августа 2010

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

curl_setopt($ch, CURLOPT_HEADER, true);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...