PHP内存耗尽(json_decode)

时间:2014-07-17 13:19:20

标签: php json memory

当我的应用程序尝试解码大型(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 env(也是128M内存限制)上对它进行了测试 - 并且它在那里工作得很好。我应该关注吗?

3 个答案:

答案 0 :(得分:3)

要永久避免这种情况,请使用基于事件的JSON解析器,如https://github.com/salsify/jsonstreamingparser

这样,整个事情就不必立即存在于记忆中。相反,您可以处理一次为您提供一个对象/数组的事件。

答案 1 :(得分:1)

没有其他PHP函数可以让你解码JSON字符串。您可以自己尝试或查找库以将JSON拆分为多个部分。

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

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

答案 2 :(得分:0)

在php中迭代大json文件的最简单方法之一是使用halaxa/json-machine。您只写一个foreach。它永远不会达到内存限制,因为它会在后台一次解析一项,因此无论文件大小如何,内存消耗都是恒定的。