PHP长卷曲请求

PHP长卷曲请求,php,json,curl,Php,Json,Curl,我正在做一个Curl请求,从提供者那里获取一个JSON文件,返回的JSON文件非常大 如果在浏览器中运行,响应是21Mb字符串。当我使用Curl运行此请求时,它不仅需要花费大量时间,而且还以一个致命错误结束:允许的内存大小为268435456字节,已耗尽错误 解决这个问题的一种方法是添加ini_集('memory_limit','512M')到我的代码(我已经用256做了,但仍然不够…)。 我想知道是否有其他方法可以更快地获取数据 我知道这不是内存泄漏,只是反应很大。 我不想增加内存限制,我知道

我正在做一个Curl请求,从提供者那里获取一个JSON文件,返回的JSON文件非常大

如果在浏览器中运行,响应是21Mb字符串。当我使用Curl运行此请求时,它不仅需要花费大量时间,而且还以一个
致命错误结束:允许的内存大小为268435456字节,已耗尽
错误

解决这个问题的一种方法是添加
ini_集('memory_limit','512M')到我的代码(我已经用256做了,但仍然不够…)。
我想知道是否有其他方法可以更快地获取数据

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


谢谢

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

现在,第一个也是最简单的优化是启用curl的内置压缩传输,通过执行
CURLOPT_ENCODING=>'
,将其设置为emptystring,告诉curl提供curl编译时使用的所有压缩编码(通常包括
gzip
deflate
),特别是gzip,当应用于json时,可以很容易地将其压缩6-7倍,这将大大加快检索json的速度,前提是您的libcurl是使用gzip支持编译的,并且目标服务器支持gzip压缩的trasnfer编码

现在,如果您想更努力地进行优化,下一步是找出目标服务器支持的最强压缩,并手动实现该压缩。例如,假设目标服务器支持的最强压缩是LZMA2,格式为
xz
。然后手动设置头
CURLOPT_HTTPHEADER=>array('Accept-Encoding:xz')
,在curl下载它之后,手动解压缩它,例如使用

  • xz虽然在大多数web服务器中不受支持,但它提供了比gzip更好的压缩,并且在某些测试中可以将JSON的utf-8压缩到10倍

但它可能不是xz,您应该找出目标服务器支持的最强大的压缩,不管它是什么,并坚持使用它。

有一些方法可以流式传输JSON,从而节省内存,但您无法加快curl请求的速度。如果可以,您应该在发送方实现某种分页。谢谢您的回复。不幸的是,我对提供者的服务器没有任何控制权:(您可以将响应下载到一个文件中,然后用类似于