PHP 5.5.6随机内存泄漏

在我们从
PHP 5.3.3迁移到
PHP 5.5.6和Apache 2.4之后,在Kohana 3.3上运行的每个站点都会不时遇到内存不足异常.

完整的错误消息

PHP Fatal error:  Allowed memory size of 268435456 bytes exhausted (tried to allocate 140316914598360 bytes) in Unknown on line 0

PHP表示它试图分配127TB的内存(最后更改字节,但仍然在TB左右).它完全随机发生.有时你会连续几个小时没有问题,并且突然有1行甚至10行内存消息.它发生在所有项目中,无论是连接到MySQL,MSSQL或MongoDB的web服务还是普通网站.

最糟糕的是这个 – 第0行的未知,它绝对没有告诉我.即使在禁用已注册的shutdown_function后,消息也没有改变.

起初我怀疑PDO dblib freetds是罪魁祸首,但是没有使用while($row = $query-> fetch()),如https://bugs.php.net/bug.php?id=64511this question所述.

到目前为止,我尝试过:

> xdebug
> memory_usage()日志记录
>在httpd

它们都表明内存分配处于完美状态.

只有strace显示了一些承诺,因为在每次抛出内存异常之前,是一堆munmap调用,它显示内存不断减少然后突然抛出异常.虽然我不确定它的可靠性,因为日志似乎有时混合(来自不同的电话).

有没有人遇到类似的东西?

调试此问题的最佳步骤是什么?

目前,我无法解决这个问题……

最佳答案 我将为自己回答这个问题,以供将来参考.

毕竟,实际的bug在pdo_dblib中.根据这个错误 – 我昨天发现的https://bugs.php.net/bug.php?id=67130 PDOStatement :: nextRowset()导致内存损坏,从而导致我们所有的问题.我通过删除这部分代码验证了它,并让它在“匆忙”流量中运行12小时.

这个错误与https://bugs.php.net/bug.php?id=64511一起修复,我一开始并没有注意到这两个是相关的.

我们的系统在CentOS上运行,PHP从软件集合中安装,因此我们下载了所述模块的源代码并手动应用了补丁,因为来自Remi的RPM存储库的同一个软件包的两个版本不起作用或不兼容.

这真的很有趣,因为我们从07.3迁移到5.5.6因为https://bugs.php.net/bug.php?id=57593(有几个错误报告和功能请求),其中没有实现PDOStatement :: nextRowset()(它在5.3.7中修复).

点赞