PHP 5.5.6 随机内存泄漏

标签 php apache pdo memory-leaks freetds

在我们从 PHP 5.3.3 迁移到 PHP 5.5.6Apache 2.4 之后,在 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 的网络服务还是普通网站。

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

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

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

  • 调试
  • memory_usage() 日志记录
  • httpd 上的 strace

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

只有 strace 显示了一些 promise ,因为在每个 out of memory 异常抛出之前,是一堆 munmap 调用,显示内存不断减少然后突然抛出异常。虽然我不确定它是否可靠,因为日志有时看起来很混杂(来自不同的调用)。

有没有人遇到过类似的事情?

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

目前,我不知道我能做些什么来解决这个问题......

最佳答案

我将自己回答这个问题,以供将来引用。

毕竟真正的错误在 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 中修复)。

关于PHP 5.5.6 随机内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30598181/

相关文章:

php - 密码重置阻止访问 phpmyadmin

php - mySQL SELECT 和 COUNT 极速查询

php - 在带有 DESCRIBE 的 PDO 准备语句中使用参数

php - Doctrine 无法连接到 MAMP mysql 数据库

php - 插入查询中没有返回真实结果

php - 将数据列添加到现有的 mySQL 表

apache - 创建虚拟主机后无法访问localhost网站

php - 为什么 header() 函数非常慢?

php - 如何使用 semanage 递归地获取持久化特定文件类型

php - 连接表并用指定值替换空值