2017-07-08 139 views
0

我正在做一个Curl请求从提供程序获取JSON文件,并且返回的JSON文件很大。PHP Long Curl请求

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

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

我知道这不是内存泄漏,它只是响应很大。 我不想增加内存限制,我知道它会工作,但我想知道是否有可能更快地获取该数据,即使我必须将其保存到文件中以供后续读取。

谢谢!

+0

有许多方法可以对JSON进行流式处理并因此节省内存,但是无法加快curl请求的速度。如果你可以的话,你应该在发送端实现某种分页。 – colburton

+0

感谢您的回复。 不幸的是我没有任何控制提供商的服务器:( –

+0

你可以下载响应到一个文件,然后用[this](https://github.com/salsify/jsonstreamingparser) – GentlemanMax

回答

0

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

现在第一和最简单的优化,是使卷曲的内置压缩传输,通过做CURLOPT_ENCODING=>'',通过将其设定emptystring,你告诉卷曲提供该卷曲编译时使用的所有压缩编码(通常包括gzipdeflate) - 特别是当gzip应用于jsons时,可以很容易地将其压缩为6-7倍,如果您的libcurl是使用gzip支持进行编译的,那么这应该是检索json的巨大提速。目标服务器支持gzip压缩trasnfer编码。

现在,如果您想更加优化,下一步就是找出目标服务器支持的最强大的压缩,并手动实施该压缩。例如,可以说目标服务器支持的最强压缩是LZMA2,格式为xz。那么你手动设置页眉CURLOPT_HTTPHEADER=>array('Accept-Encoding: xz'),和卷曲已下载后,用https://github.com/payden/php-xz

  • XZ手动解压,例如,而在大多数网络服务器并不普遍支持,提供比gzip更好的压缩和可以在一些测试

压缩JSON的UTF-8到10倍,但它可能是不征,你应该弄清楚目标服务器的最强支持的压缩,不管它是什么,并坚持下去。