PHP Long Curl请求

时间:2017-07-08 13:55:26

标签: php json curl

我正在执行Curl请求以从提供程序获取JSON文件,并且返回的JSON文件很大。

如果我在浏览器中运行它,响应是一个21Mb的字符串。当我使用Curl运行此请求时,它不会花费很多时间,但也会以Fatal error: Allowed memory size of 268435456 bytes exhausted错误结束。

解决这个问题的一种方法是将ini_set('memory_limit', '512M');添加到我的代码中(我已经用256做了,但它还不够......)。 我想知道是否有另一种方法可以更快地获得数据?

我知道它不是内存泄漏,只是响应很大。 我不想增加内存限制,我知道它会起作用,但我想知道是否可以更快地获取数据,即使我必须保存把它放到一个文件中以便阅读。

谢谢!

1 个答案:

答案 0 :(得分:0)

好吧,JSON是UTF-8,大多数UTF-8数据压缩得非常好。

现在第一个也是最简单的优化,是通过将CURLOPT_ENCODING=>''设置为emptystring来启用curl的内置压缩传输,你告诉curl提供curl编译的所有压缩编码(通常包括gzipdeflate) - 特别是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虽然在大多数Web服务器中不常支持,但提供比gzip更好的压缩,并且在某些测试中可以将JSON的utf-8压缩到10倍

但它可能不是xz,你应该弄清楚目标服务器最强的支持压缩,无论它是什么,并坚持下去。