Я использую 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 секунд, будет исчерпать допустимую память, но это далеко не удовлетворительно.
Первоначально я использовал это решение, но обнаружил, что некоторые веб-сайты (например, Amazon) не принимают запросы HEAD. – lucas