首页 文章

防止curl为较大的文件生成致命错误

提问于
浏览
3

我使用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 回答

  • 0

    如果您正在获取 Headers 信息,那么为什么不使用 HEAD 请求?这避免了在最大16MiB内存插槽中获取整个页面的内存使用情况 .

    curl_setopt($ch, CURLOPT_HEADER, true);
    

    然后,对于页面 Headers ,请使用 file_get_contents() ,因为它的本机内存分配更好 .

  • 2

    您是否尝试使用 CURLOPT_FILE 将文件直接保存到磁盘而不是使用内存?您甚至可以指定 /dev/null 以使其无处可寻......

    或者,您可以使用 CURLOPT_WRITEFUNCTION 设置自定义数据写入功能 . 让函数只扫描 Headers 然后丢弃实际数据 .

    或者,通过 php.ini 为PHP提供更多内存 .

相关问题