4

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

4

2 回答 2

2

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

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

或者,通过php.ini.

于 2010-08-14T01:18:13.453 回答
0

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

curl_setopt($ch, CURLOPT_HEADER, true);

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

于 2010-08-14T01:20:46.533 回答