在我们从
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=64511或this 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中修复).