什么是“zend_mm_heap corrupted”的意思?

133

最近我的应用程序出现了之前从未遇到过的问题。我决定查看Apache的错误日志,结果发现一个错误消息,显示"zend_mm_heap corrupted"。这是什么意思。

操作系统:Fedora Core 8 Apache版本:2.2.9 PHP版本:5.2.6


3
我使用了USE_ZEND_ALLOC=0来获取错误日志中的堆栈跟踪信息,发现了一个错误/usr/sbin/httpd: corrupted double-linked list,我发现注释掉opcache.fast_shutdown=1对我有用。 - Spidfire
是的,我也是。还可以看到下面的另一个报告 https://dev59.com/AHE95IYBdhLWcg3wlu4g#35212026 - lkraav
我在使用Laravel时遇到了同样的问题。我将一个类注入到另一个类的构造函数中。我注入的类又注入了它所注入的类,从而导致了堆问题。简而言之,就是创建了一个循环引用。 - Thomas
1
重新启动Apache服务器是最快和临时的解决方案 :) - Leopathu
41个回答

2

我在使用 PHP 的 Mongo 2.2 驱动程序时遇到了这个错误:

$collection = $db->selectCollection('post');
$collection->ensureIndex(array('someField', 'someOtherField', 'yetAnotherField')); 

^^无法工作

$collection = $db->selectCollection('post');
$collection->ensureIndex(array('someField', 'someOtherField')); 
$collection->ensureIndex(array('yetAnotherField')); 

^^ WORKS! (?!)


这个答案帮助我进行了调试,走上了Mongo问题的路径。在我的情况下,PHP 5.6 + Mongo 1.6.9驱动程序中,当通过“foreach(selectCollection()->find()) { $arr = .. }”从先前填充的数组中迭代和查询值时,会抛出zend_mm_heap损坏的消息。 - Mihai MATEI

2

我认为造成这个问题的原因有很多。在我的情况下,我给两个类命名了相同的名称,其中一个会尝试加载另一个。

class A {} // in file a.php
class A // in file b.php
{
  public function foo() { // load a.php }
}

在我的情况下,它引起了这个问题。(使用Laravel框架,在真实环境中运行php artisan db:seed)

2
在PHP 5.3上,经过大量搜索,以下是对我有效的解决方案:
我通过添加以下内容来禁用此页面的PHP垃圾回收:disabled the PHP garbage collection
<? gc_disable(); ?>

把代码加到有问题的页面末尾,就可以解决所有错误。

来源


2

我也在我拥有的一个服务器上遇到了这个问题,根本原因是APC。我在php.ini文件中注释掉了"apc.so"扩展,重新加载了Apache,网站马上恢复正常。


2

寻找使用缓冲的任何模块,并有选择地禁用它。

我正在CentOS 4.8上运行PHP 5.3.5,在这之后,我发现eaccelerator需要升级。


2
我尝试了上面所有的方法,只有一个配置设置zend.enable_gc = 0对我有帮助。
PHP版本为5.3.10-1ubuntu3.2,安装了Suhosin-Patch(cli) (编译日期: Jun 13 2012 17:19:58)。

1

对我来说,问题出在使用pdo_mysql。查询返回了1960个结果。我试图返回1900条记录,它可以正常工作。因此问题是pdo_mysql和数组过大。我用原始的mysql扩展重写了查询,它可以正常工作。

$link = mysql_connect('localhost', 'user', 'xxxx') or die(mysql_error());
mysql_select_db("db", $link);

Apache 没有报告任何先前的错误。

zend_mm_heap corrupted
zend_mm_heap corrupted
zend_mm_heap corrupted
[Mon Jul 30 09:23:49 2012] [notice] child pid 8662 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:50 2012] [notice] child pid 8663 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:54 2012] [notice] child pid 8666 exit signal Segmentation fault (11)
[Mon Jul 30 09:23:55 2012] [notice] child pid 8670 exit signal Segmentation fault (11)

1

我曾经遇到过同样的问题,当时是因为在memcached会话的session.save_path中设置了错误的IP地址。将其更改为正确的IP地址后,问题得以解决。


1
很多人提到禁用XDebug来解决问题。在很多情况下,这显然是不可行的,因为启用它是有原因的-用于调试代码。
我遇到了同样的问题,并注意到如果我停止在我的IDE(PhpStorm 2019.1 EAP)中监听XDebug连接,则错误停止发生。
对于我来说,实际修复方法是删除任何现有的断点。
这个有效修复的可能性是,PhpStorm有时不能很好地删除不再引用已更改外部文件(例如通过git)的有效代码行的断点
编辑: 在xdebug问题跟踪器中找到了相应的错误报告: https://bugs.xdebug.org/view.php?id=1647

希望你不要在生产服务器上进行调试 ;) - bkulyk
1
啊,不不,我在本地的 Docker 容器上遇到了堆栈损坏错误。 - LarryFisherman
1
同样的问题,具体来说是条件断点——在那个时候我的代码实际上无法到达的位置,但是......移除那个单独的断点(保留另一个常规断点)解决了这个问题。 - MSpreij

1
我正在编写一个PHP扩展,也遇到了这个问题。当我从我的扩展中调用一个带有复杂参数的外部函数时,就会出现这个错误。
原因是在外部函数中没有为参数(char *)分配内存。如果您正在编写同类扩展,请注意这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接