题
我正在使用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()
相反,由于其本机内存分配要好得多。
不隶属于 StackOverflow