PHP 5.5.6随机内存泄漏

时间:2015-06-02 13:57:07

标签: php apache pdo memory-leaks freetds

从PHP 5.5.6迁移到PHP Apache 2.45.3.3之后,Kohana 3.3上运行的每个网站都会偶尔遇到Out of memory异常。

完整的错误消息

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服务还是普通网站。

最糟糕的是 - Unknown on line 0告诉我绝对没有。即使在禁用已注册的shutdown_function后,该消息也没有改变。

起初我怀疑PDO dblib + freetds是罪魁祸首,但却无法使用https://bugs.php.net/bug.php?id=64511this question中描述的while($row = $query->fetch())

到目前为止,我已经尝试过:

  • Xdebug的
  • memory_usage()记录
  • strace on httpd

他们都表明内存分配处于完美状态。

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

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

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

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

1 个答案:

答案 0 :(得分:2)

我将为自己回答这个问题,以供将来参考。

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

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

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

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