我正在使用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指向较大的文件,那么我会遇到致命错误:

致命错误: :允许记忆大小为16777216字节耗尽(试图分配14421576字节)

无论如何是否有防止这种情况?例如,通过告诉卷曲放弃文件是否太大,还是通过捕获错误?

作为解决方法,我添加了

curl_setopt($ ch,curlopt_timeout,3);假设任何需要超过3秒的文件来加载的文件都会耗尽允许的内存,但这远非令人满意。

有帮助吗?

解决方案

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

或者,您可以使用 CURLOPT_WRITEFUNCTION 设置自定义数据编写功能。拥有功能只需扫描标题,然后丢弃实际数据即可。

或者,通过 php.ini.

其他提示

如果您获取标题信息,那为什么不使用 HEAD 要求?这避免了在Maximumm 16MIB内存插槽中获取整个页面的内存使用情况。

curl_setopt($ch, CURLOPT_HEADER, true);

然后,对于页面标题,请使用 file_get_contents() 相反,由于其本机内存分配要好得多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top