我使用curl和php来查找有关给定URL的信息(例如http状态代码,mimetype,http重定向位置,页面 Headers 等) .
$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 回答
如果您正在获取 Headers 信息,那么为什么不使用
HEAD
请求?这避免了在最大16MiB内存插槽中获取整个页面的内存使用情况 .然后,对于页面 Headers ,请使用
file_get_contents()
,因为它的本机内存分配更好 .您是否尝试使用
CURLOPT_FILE
将文件直接保存到磁盘而不是使用内存?您甚至可以指定/dev/null
以使其无处可寻......或者,您可以使用
CURLOPT_WRITEFUNCTION
设置自定义数据写入功能 . 让函数只扫描 Headers 然后丢弃实际数据 .或者,通过
php.ini
为PHP提供更多内存 .