zend_mm_heap 被标准 PHP 5.6 损坏:定位原因

Posted

技术标签:

【中文标题】zend_mm_heap 被标准 PHP 5.6 损坏:定位原因【英文标题】:zend_mm_heap corrupted with standard PHP 5.6: locating the cause 【发布时间】:2018-11-19 00:36:06 【问题描述】:

php 的 opcache 参数设置为 1(打开,默认值)会在 Apache 日志文件中以每天几次的频率不定期地出现“zend_mm_heap 已损坏”错误。

以前的 *** 答案表明这可能是因为 (a) 使用了其他缓存模块,例如 APC - 这里不是这种情况,因为仅使用标准 PHP 发行版而没有任何非本地缓存或 (b) 用完内存 - 但根据free -m 或 (c) PHP 编译器中的错误,我至少有 1.6G 可用交换空间 - 不太可能,因为这个错误没有被广泛报道,我没有做任何不寻常的事情。

服务器运行多个网站,使用 Drupal、Joomla 和定制 PHP 构建。我正在使用 Amazon Linux 2 上的事件 MPM 运行带有 mod_php 和 Apache 2.4.33 的标准 PHP5.6.36。

唯一不是完全标准的东西是我使用 Amazon AWS SDK for PHP v. 3 发送邮件,但我没有理由认为这是导致问题的原因。

如何找出导致堆损坏的原因?

【问题讨论】:

在 6 月 25 日至 6 月 30 日期间,我有 60 条连续的 error_log 行,在 CentOS 7 和 PHP v5.5.382.0 Apache/2.4.6 上也是如此,有趣的是服务器除了一点停机时间之外继续运行 【参考方案1】:

看起来这个错误是reported。在 cmets 中,建议在 php.ini 中设置以下内容:

opcache.revalidate_freq=7000
opcache.fast_shutdown=0

【讨论】:

我做了这些设置。 zend_mm_heap corrupted 消息的比率有所下降 - 在过去 24 小时内只有两条 - 但它们并没有消失。谜题是为什么我得到这个,虽然使用相当标准的 PHP 设置,但大概大多数其他人没有得到这些错误。因此我的问题是寻找原因(以及解决方案)。 Joe Watkins 很好地解释了为什么会发生这种情况 (***.com/a/36350601/1050507)。不幸的是,这不是一个容易调试的问题。建议是禁用 opcache 或查找导致问题的代码。

以上是关于zend_mm_heap 被标准 PHP 5.6 损坏:定位原因的主要内容,如果未能解决你的问题,请参考以下文章

mac下更新自带的PHP版本到5.6

mac下更新自带的PHP版本到5.6或7.0

mac下更新自带的PHP版本到5.6或7.0

mac下更新自带的PHP版本到5.6或7.0

在 puphpet PHP 5.6 上找不到类“SimpleXMLElement”

Laravel 5.6 DELETE 和 PUT 403 访问被禁止