【问题标题】:Prevent curl generating fatal error for larger files防止 curl 为较大的文件生成致命错误
【发布时间】:2011-03-29 17:40:25
【问题描述】:

我正在使用 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,数组 ( "接受: 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 秒的文件都会耗尽允许的内存,但这远不能令人满意。

【问题讨论】:

    标签: php curl fatal-error


    【解决方案1】:

    如果您正在获取标头信息,那么为什么不使用HEAD 请求呢?这样可以避免在最大 16MiB 内存插槽中获取整个页面的内存使用。

    curl_setopt($ch, CURLOPT_HEADER, true);
    

    然后,对于页面标题,请改用file_get_contents(),因为它的本机内存分配要好得多。

    【讨论】:

    • 本来我是用这个方案的,但是发现有些网站(比如亚马逊)不接受HEAD请求。
    【解决方案2】:

    您是否尝试过使用CURLOPT_FILE 将文件直接保存到磁盘而不是使用内存?您甚至可以指定/dev/null 将其放在任何地方...

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

    或者,通过php.ini 给 PHP 更多内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 2021-10-02
      • 2018-11-21
      相关资源
      最近更新 更多