升级到PHP 5.5后,序列化的奇怪问题,最大循环参考深度?

时间:2016-01-28 05:38:16

标签: php memory serialization php-5.5 cyclic-reference

我有一个相当大的图形,在PHP内存中有循环引用。 我将整个图表序列化以将其存储在请求之间。 它在PHP5.3上运行良好,但现在我升级到PHP5.5并且发生了一些奇怪的事情:

PHP / Apache在序列化期间突然崩溃/退出并且chrome显示ERR_CONNECTION_RESET de PHP日志中没有错误,Apache日志中也没有任何调试模式。

经过相当多的调试后,我注意到如果我将图形缩小一点,它仍然有效。但是,如果我一点一点地重新打开数据,那么如果我重新引入它们,则会有非常具体的点失败。如果我跳过那个特定的点并引入其他数据,我仍然可以继续。

不是内存问题

我设置了一个非常高的内存限制:memory_limit = 2048M,就在我引入崩溃的数据之前memory_get_usage()提供了26M而memory_get_peak_usage()提供了41M,所以&# 39;剩下的很多。

不是时间问题

它可能没有时间相关,因为它完全在超时设置范围内,当它崩溃时,它实际上比完成最后一次工作序列化所需的时间更快崩溃。

过多的循环引用/循环?

我引入的数据导致崩溃在对象方面没有什么特别之处。它是所有相同类型的PHP对象(为简单起见,节点和边缘)。直接围绕我引入的对象的关系也不会告诉我任何奇怪的事情。我想到的一件事是,一旦出现问题,就会出现问题。数据是通过序列化算法遍历所有对象更改的方式引入的,改变遍历路径并导致某些事情崩溃,因为......太深入地嵌套了?

其他一些上限?

我能想到的另一件事是我还有一些其他的上限。因为事情是:一旦我发现了一个有问题的'在没有导致崩溃的情况下我无法重新打开的数据,如果我先将其他部分关闭,我可以重新打开它。所以这似乎根本没有指向数据。但是哪个限制?我能够挤出的最大字符串长度是5.517.365个字符,根据mb_strlen($string, '8bit'),这个字符有点超过5MB。但有时字符串大约有4百万个字符,当我稍微添加一点时它会崩溃。这仍然可能意味着这一小部分数据导致图形的某些更深/更大的部分更早地被序列化,从而在内部达到某个上限?

serialize()是否使用类似缓冲区或tmp文件的东西,或者它是否真的只使用普通内存'?

我可能会遇到哪些其他界限?和/或哪些设置可以解决它?

0 个答案:

没有答案