PHP内存耗尽(json_decode)

5
当我的应用程序尝试解码较大(15K〜行)的JSON字符串(来自CURL)时,会出现错误信息:
允许的内存大小为134217728字节已用尽(尝试分配91字节)
我知道可以扩展内存限制或取消限制,但我宁愿避免这样做。我一直在想是否有不同的方法来解决这种问题 - 例如将JSON字符串分成小块(如array_chunk)。
更新
为了确保问题不是由应用程序中的其他函数/循环引起的,我将JSON字符串提取到文件中,并尝试从文件直接解码它(文件大小= 11.8MB)。但仍然失败。
$y = json_decode( file_get_contents('/var/tmp/test.txt') );

更新2 该脚本在Mac OS X环境下运行。我还在Ubunto环境(也是128M内存限制)上进行了测试,那里它完美地工作。我应该担心吗?


2
这个JSON字符串有多大?因为128Mb占用了很多内存... - Niet the Dark Absol
1
@NiettheDarkAbsol,“MB”不是“Mb”。有很大的区别。 - Marcin Orlowski
@MarcinOrlowski 哎呀,确实是这样。不过,128Mb(16MB)的RAM在单个PHP脚本中使用仍然是非常多的。 - Niet the Dark Absol
@Niet - 英国工党上次大选的政治宣言也犯了同样的错误,承诺为英国每个家庭提供100MB宽带。如果他们赢得了选举,然后意识到他们实际上承诺了什么,我会非常喜欢的。 - Mark Baker
@NiettheDarkAbsol 也许你应该了解一下计算机中的单位? :-) 1 字节 = 8 位。134217728 字节 = 134 MB(百万字节)= 1072 Mb(百万位)。 - thedom
显示剩余12条评论
3个回答

4
为了永久避免这种情况,使用基于事件的 JSON 解析器,比如 https://github.com/salsify/jsonstreamingparser。这样,整个对象/数组不需要一次性全部在内存中加载。相反,您可以逐个处理事件,每次处理一个对象/数组的一部分。

2

没有其他的PHP函数可以让你解码JSON字符串。你可以自己尝试或者找到库来分割JSON。

然而,你应该确保这是唯一的问题。例如,在解码JSON数据之前,您可能创建了大型数组或创建了许多对象。

如果我是你,我会将这个JSON字符串保存到文件中,并编写额外的脚本,只是为了从文件中获取它并解码以确保仅使用json_decode存在问题。


1

在PHP中迭代大型JSON文件的最简单方法之一是使用halaxa/json-machine。您只需要编写一个foreach循环即可。它永远不会达到内存限制,因为它在后台一次解析一个项目,所以无论文件大小如何,内存消耗都是恒定的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接