我正在执行Curl请求以从提供程序获取JSON文件,并且返回的JSON文件很大。
如果我在浏览器中运行它,响应是一个21Mb的字符串。当我使用Curl运行此请求时,它不会花费很多时间,但也会以Fatal error: Allowed memory size of 268435456 bytes exhausted
错误结束。
解决这个问题的一种方法是将ini_set('memory_limit', '512M');
添加到我的代码中(我已经用256做了,但它还不够......)。
我想知道是否有另一种方法可以更快地获得数据?
我知道它不是内存泄漏,只是响应很大。 我不想增加内存限制,我知道它会起作用,但我想知道是否可以更快地获取数据,即使我必须保存把它放到一个文件中以便阅读。
谢谢!
答案 0 :(得分:0)
好吧,JSON是UTF-8,大多数UTF-8数据压缩得非常好。
现在第一个也是最简单的优化,是通过将CURLOPT_ENCODING=>''
设置为emptystring来启用curl的内置压缩传输,你告诉curl提供curl编译的所有压缩编码(通常包括gzip
和deflate
) - 特别是gzip,当应用于jsons时,可以轻松地将其压缩6-7倍,这应该是检索json的巨大加速,您的libcurl是使用gzip支持编译的,目标服务器支持gzip压缩的trasnfer-encoding。
现在,如果你想更加优化,下一步就是弄清楚目标服务器支持的最强压缩是什么,并手动实现压缩。比方说,目标服务器支持的最强压缩是LZMA2,格式为xz
。然后你手动设置标题CURLOPT_HTTPHEADER=>array('Accept-Encoding: xz')
,在curl下载后,手动解压缩,例如https://github.com/payden/php-xz
但它可能不是xz,你应该弄清楚目标服务器最强的支持压缩,无论它是什么,并坚持下去。