【问题标题】:What does "zend_mm_heap corrupted" mean“zend_mm_heap 已损坏”是什么意思
【发布时间】:2011-01-15 22:04:51
【问题描述】:

突然之间,我的应用程序出现了前所未有的问题。我决定检查 Apache 的错误日志,发现一条错误消息说“zend_mm_heap 已损坏”。这是什么意思。

操作系统:Fedora Core 8 阿帕奇:2.2.9 PHP:5.2.6

【问题讨论】:

  • 我使用USE_ZEND_ALLOC=0 获取错误日志中的堆栈跟踪并发现了错误/usr/sbin/httpd: corrupted double-linked list,我发现注释掉opcache.fast_shutdown=1 对我有用。
  • 是的,这里也一样。另请参阅下方的另一份报告stackoverflow.com/a/35212026/35946
  • 我在使用 Laravel 时也遇到了同样的问题。我将一个类注入到另一个类的构造函数中。我正在注入的类正在注入它被注入的类,基本上是创建一个导致堆问题的循环引用。
  • 重启 Apache 服务器以获得最快的临时解决方案 :)

标签: php fedora heap-corruption php-internals


【解决方案1】:

我在本地开发中遇到了这个问题,同时使用 docker & php 的内置开发服务器和 Craft CMS。

我的解决方案是使用 Redis 进行 Craft 的会话。

PHP 7.4

【讨论】:

  • 任何进一步的调查,为什么这会有所帮助?会话是否太大,导致某种溢出?
【解决方案2】:

zend_mm_heap 损坏的问题困扰了我大约几个小时。首先,我禁用并删除了 memcached,尝试了这个问题的答案中提到的一些设置,经过测试,这似乎是 OPcache 设置的问题。我禁用了 OPcache,问题就消失了。之后我重新启用了 OPcache,对我来说

core notice: child pid exit signal Segmentation fault

zend_mm_heap corrupted

显然已通过更改解决

/etc/php.d/10-opcache.ini

我在此处包含了我更改的设置; opcache.revalidate_freq=2 仍然被注释掉,我没有改变那个值。

opcache.enable=1
opcache.enable_cli=0
opcache.fast_shutdown=0
opcache.memory_consumption=1024
opcache.interned_strings_buffer=128
opcache.max_accelerated_files=60000

【讨论】:

    【解决方案3】:

    这个选项已经在上面写过了,但是我想引导你完成我如何重现这个错误的步骤。

    简单地说。它帮助了我:

    opcache.fast_shutdown = 0
    

    我的旧配置:

    1. CentOS 6.9 版(最终版)
    2. PHP 5.6.24 (fpm-fcgi) 与 Zend OPcache v7.0.6-dev
    3. Bitrix CMS

    一步一步:

    1. 运行phpinfo()
    2. 在输出中找到“OPcache”。它应该被启用。如果没有,那么这个解决方案肯定对你没有帮助。
    3. 在任何地方执行opcache_reset()(感谢bug report,评论[2015-05-15 09:23 UTC] nax_hh at hotmail dot com)。在您的网站上加载多个页面。如果 OPcache 是罪魁祸首,那么在 nginx 日志中会出现一行文本

    104:对等方重置连接

    在 php-fpm 日志中

    zend_mm_heap 损坏

    在下一行

    fpm_children_bury()

    1. 设置opcache.fast_shutdown=0(我在/etc/php.d/opcache.ini文件中)
    2. 重启php-fpm(如service php-fpm restart
    3. 再次加载您网站的某些页面。执行opcache_reset() 并再次加载一些页面。现在应该没有错误了。

    顺便说一句。在phpinfo()的输出中,可以找到OPcache的统计信息,然后优化参数(比如增加内存限制)。 Good instructions 用于调整 opcache(俄语,但你可以使用翻译器)

    【讨论】:

      【解决方案4】:

      很多人都提到禁用 XDebug 来解决问题。这在很多情况下显然是不可行的,因为启用它是有原因的——调试你的代码。

      我遇到了同样的问题,并注意到如果我停止在我的 IDE (PhpStorm 2019.1 EAP) 中侦听 XDebug 连接,错误就会停止发生。

      对我来说,实际的解决方法是删除所有现有的断点。

      这是一个有效修复的可能性是,PhpStorm 有时不擅长删除在外部更改文件(例如通过 git)后不再引用有效代码行的断点

      编辑: 在 xdebug 问题跟踪器中找到了相应的错误报告: https://bugs.xdebug.org/view.php?id=1647

      【讨论】:

      • 希望你不是在生产服务器上调试 ;)
      • 啊,不,我在本地 docker 容器上遇到堆损坏错误
      • 这里相同,特别是一个条件断点 - 在那个点实际上无法从我的代码中到达,但尽管如此.. 删除该单个断点(留下另一个常规断点)修复它。
      【解决方案5】:

      在升级到 jessie 的 Debian 服务器上拥有 zend_mm_heap corruptedchild pid ... exit signal Segmentation fault。经过长时间的调查,事实证明 XCache 是在 Zend-Engine 普遍可用之前安装的。

      apt-get remove php5-xcacheservice apache2 restart 之后,错误消失了。

      【讨论】:

        【解决方案6】:

        真正在您的代码中寻找无声错误。在我的 Symfony 应用程序中,从 twig 基本模板中删除一个块后,我得到了 zend_mm_heap 损坏的错误,但不记得它在子模板中被引用过。没有抛出任何错误。

        【讨论】:

          【解决方案7】:

          根据错误跟踪器,设置opcache.fast_shutdown=0。快速关闭使用 Zend 内存管理器来清理它的混乱,这将禁用它。

          【讨论】:

          • 这修复了我们的 CentOS Linux 版本 7.2.1511、PHP 5.5.38 上的“zend_mm_heap 损坏”。我们现在可以恢复使用操作码缓存。没有它的日日夜夜。
          • 感谢提醒,这正是我的问题!
          【解决方案8】:

          这里的许多答案都是旧的。对我来说(通过 Ondrej Sury 在 ubuntu 14.04 和 16.04 上的 PPA 的 php 7.0.10)问题似乎出在 APC 上。我正在使用 apc_fetch() 等缓存数百个小数据位,当使缓存的一块无效时,我会收到错误消息。解决方法是切换到基于文件系统的缓存。

          更多细节在 github https://github.com/oerdnj/deb.sury.org/issues/452#issuecomment-245475283

          【讨论】:

            【解决方案9】:

            万一其他人遇到与我相同的问题,我想我会提供适合我的解决方案。

            我在 Windows 上安装了php,而不是我的系统驱动器 (H:)。

            在我的 php.ini 文件中,几个不同的文件系统变量的值写成 \path\to\directory - 如果我的安装是在 C: 上,它会工作得很好。

            我需要将值更改为H:\path\to\directory。在我的php.ini 文件中的几个不同位置添加驱动器号可以立即解决问题。我还确保(尽管我认为没有必要)在我的PEAR config 中解决同样的问题——因为几个变量值也排除了那里的驱动器号。

            【讨论】:

              【解决方案10】:

              这不是必须通过更改配置选项来解决的问题。

              更改配置选项有时会产生积极影响,但也很容易使事情变得更糟,或者什么都不做。

              错误的性质是这样的:

              #include <stdio.h>
              #include <string.h>
              #include <stdlib.h>
              
              int main(void) {
                  void **mem = malloc(sizeof(char)*3);
                  void *ptr;
              
                  /* read past end */
                  ptr = (char*) mem[5];   
              
                  /* write past end */
                  memcpy(mem[5], "whatever", sizeof("whatever"));
              
                  /* free invalid pointer */
                  free((void*) mem[3]);
              
                  return 0;
              }
              

              上面的代码可以编译成:

              gcc -g -o corrupt corrupt.c
              

              使用 valgrind 执行代码会看到很多内存错误,最终导致分段错误:

              krakjoe@fiji:/usr/src/php-src$ valgrind ./corrupt
              ==9749== Memcheck, a memory error detector
              ==9749== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
              ==9749== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
              ==9749== Command: ./corrupt
              ==9749== 
              ==9749== Invalid read of size 8
              ==9749==    at 0x4005F7: main (an.c:10)
              ==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
              ==9749== 
              ==9749== Invalid read of size 8
              ==9749==    at 0x400607: main (an.c:13)
              ==9749==  Address 0x51fc068 is 24 bytes after a block of size 16 in arena "client"
              ==9749== 
              ==9749== Invalid write of size 2
              ==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
              ==9749==    by 0x40061B: main (an.c:13)
              ==9749==  Address 0x50 is not stack'd, malloc'd or (recently) free'd
              ==9749== 
              ==9749== 
              ==9749== Process terminating with default action of signal 11 (SIGSEGV): dumping core
              ==9749==  Access not within mapped region at address 0x50
              ==9749==    at 0x4C2F7E3: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
              ==9749==    by 0x40061B: main (an.c:13)
              ==9749==  If you believe this happened as a result of a stack
              ==9749==  overflow in your program's main thread (unlikely but
              ==9749==  possible), you can try to increase the size of the
              ==9749==  main thread stack using the --main-stacksize= flag.
              ==9749==  The main thread stack size used in this run was 8388608.
              ==9749== 
              ==9749== HEAP SUMMARY:
              ==9749==     in use at exit: 3 bytes in 1 blocks
              ==9749==   total heap usage: 1 allocs, 0 frees, 3 bytes allocated
              ==9749== 
              ==9749== LEAK SUMMARY:
              ==9749==    definitely lost: 0 bytes in 0 blocks
              ==9749==    indirectly lost: 0 bytes in 0 blocks
              ==9749==      possibly lost: 0 bytes in 0 blocks
              ==9749==    still reachable: 3 bytes in 1 blocks
              ==9749==         suppressed: 0 bytes in 0 blocks
              ==9749== Rerun with --leak-check=full to see details of leaked memory
              ==9749== 
              ==9749== For counts of detected and suppressed errors, rerun with: -v
              ==9749== ERROR SUMMARY: 4 errors from 3 contexts (suppressed: 0 from 0)
              Segmentation fault
              

              如果你不知道,你已经知道mem 是堆分配的内存;堆是指程序在运行时可用的内存区域,因为程序明确请求它(在我们的例子中是 malloc)。

              如果你玩弄这些糟糕的代码,你会发现并非所有那些明显不正确的语句都会导致分段错误(致命的终止错误)。

              我在示例代码中明确犯了这些错误,但在内存管理环境中很容易发生相同类型的错误:如果某些代码没有以正确的方式维护变量(或其他符号)的引用计数,例如,如果它释放得太早,另一段代码可能会从已经释放的内存中读取,如果它以某种方式存储地址错误,另一段代码可能会写入无效内存,它可能会被释放两次.. .

              这些不是可以在 PHP 中调试的问题,它们绝对需要内部开发人员的注意。

              行动方案应该是:

              1. http://bugs.php.net 上打开错误报告
                • 如果您有段错误,请尝试提供backtrace
                • 包含尽可能多的配置信息,尤其是在您使用 opcache 包含优化级别的情况下。
                • 请继续检查错误报告以获取更新,可能需要更多信息。
              2. 如果您加载了 opcache,请禁用优化
                • 我没有选择 opcache,它很棒,但已知它的一些优化会导致错误。
                • 如果这不起作用,即使您的代码可能较慢,请先尝试卸载 opcache。
                • 如果其中任何一项更改或修复了问题,请更新您提交的错误报告。
              3. 一次性禁用所有不必要的扩展。
                • 开始单独启用所有扩展,在每次配置更改后进行彻底测试。
                • 如果您发现问题扩展,请使用更多信息更新您的错误报告。
              4. 利润。

              可能没有任何利润...我一开始就说过,你也许可以通过乱七八糟的配置找到改变症状的方法,但这非常偶然,对下一个没有帮助当您有相同的zend_mm_heap corrupted 消息时,配置选项就这么多。

              当我们发现错误时创建错误报告真的很重要,我们不能假设下一个遇到错误的人会这样做......更有可能的是,实际解决方案绝不是神秘的,如果你让正确的人意识到问题。

              USE_ZEND_ALLOC

              如果在环境中设置USE_ZEND_ALLOC=0,这会禁用 Zend 自己的内存管理器; Zend 的内存管理器确保每个请求都有自己的堆,所有内存在请求结束时都被释放,并且针对分配的内存块进行了优化,大小正好适合 PHP。

              禁用它会禁用这些优化,更重要的是它可能会造成内存泄漏,因为有很多扩展代码依赖于 Zend MM 在请求结束时为它们释放内存(啧啧,啧啧)。

              它也可能隐藏症状,但系统堆可能会以与 Zend 的堆完全相同的方式被破坏。

              它可能看起来更宽容或更宽容,但解决问题的根本原因,它不能

              完全禁用它的能力是为了内部开发人员的利益;您应该永远在禁用 Zend MM 的情况下部署 PHP。

              【讨论】:

              • 那么根本问题可能是您运行的是哪个版本的 PHP?
              • @Ishmael 是的,以及所有扩展的版本,因为警告可能来自扩展。
              • 这个答案对我来说似乎是最好的。我亲身经历过几次这个问题,它总是与错误的扩展有关(在我的例子中,是 Enchant 拼写库)。除了php本身,也可能是环境不好(lib版本不匹配、依赖错误等)
              • 到目前为止,这个问题以及许多其他类似问题的最佳答案
              • 我没有建议开发者应该调试问题。我用通俗易懂的代码和文字对问题进行了解释,并建议他们创建一个错误报告,最后给他们关于创建和维护有用的错误报告的建议。这里唯一要做的就是创建一个错误报告,弄乱设置、扩展、版本和环境变量只是可怕的猜测;有人可以在两秒钟内解决问题,你不需要调试它,也不需要成为 C 大师,甚至知道 GDB 是如何工作的,只需发送邮件(报告)给合适的人,问题就会消失。跨度>
              【解决方案11】:

              对我来说,在我尝试之前,之前的答案都不起作用:

              opcache.fast_shutdown=0
              

              到目前为止,这似乎有效。

              我正在使用带有 PHP-FPM 和 Apache proxy_fcgi 的 PHP 5.6,如果这很重要的话......

              【讨论】:

              • 对于所有不同的场景,都有大量“我也是”的回应,但这似乎与我的配置最相似,并且繁荣 - 这种确切的变化似乎已经消除了我的问题。
              【解决方案12】:

              在 2014 年 11 月 13 日修复了 PHP 中的一个错误:

              修复了错误 #68365(zend_hash_copy 内存溢出后 zend_mm_heap 损坏)。

              这已在 5.4.35、5.5.19 和 5.6.3 版本中更新。就我而言,当我从使用 Ubuntu 的官方可信赖软件包 (5.5.9+dfsg-1ubuntu4.14) 更改为由 Ondrej Sury 打包的 5.5.30 版本时,问题就消失了。其他解决方案都不适合我,我不想禁用 opcache 或抑制错误,因为这确实会导致段错误(500 个响应)。

              Ubuntu 14.04 LTS:

              export LANG=C.UTF-8       # May not be required on your system
              add-apt-repository ondrej/php5
              apt-get update
              apt-get upgrade
              

              【讨论】:

                【解决方案13】:

                对我来说,它是带有 Xdebug 的 RabbitMq 进入 PHPStorm,所以 > Settings/Language and frameworks/PHP/Debug/Xdebug > 取消勾选“可以接受外部连接”。

                【讨论】:

                  【解决方案14】:

                  如果你在 Linux 机器上,在命令行上试试这个

                  export USE_ZEND_ALLOC=0
                  

                  【讨论】:

                  • 这救了我!我将其添加到 php-fpm 服务文件中(systemd 覆盖)
                  • 这是为我做的。如果您在 ubuntu 服务器上运行此行,并且从 ppas (apt) 安装了 apache 和 php,请记住将此行添加到 /etc/apache2/envvars。当我从 ondrej 的存储库安装 PHP 7.0-RC4 时,它开始抛出此错误。
                  • 它也适用于 Windows:set USE_ZEND_ALLOC=0
                  【解决方案15】:

                  经过反复试验,我发现如果我在 php.ini 文件中增加output_buffering 的值,这个错误就消失了

                  【讨论】:

                  • 增加什么?为什么此更改会使此错误消失?
                  • @JDS 这个答案有助于解释什么是 output_buffering 以及为什么增加它可以帮助stackoverflow.com/a/2832179/704803
                  • @andrewtweber 我知道 ob 是什么,我想知道 dsmithers 的回答中遗漏的具体细节,因为我收到了与 op 相同的错误消息。关闭:原来我的问题是与 memcached 相关的错误配置设置。不过谢谢!
                  • @JDS 什么配置错误?
                  • @KyleCronin 我们的服务平台在生产中使用 Memcache。但是,一些单一实例——非生产/沙盒、客户一次性——不使用内存缓存。在后一种情况下,我一次性将一个配置从生产环境复制到了客户,并且 memcache 配置指示了一个在该环境中不可用的 memcache 服务器 URI。我删除了该行并在应用程序中禁用了 memcache,问题就消失了。因此,长话短说,在特定环境中遇到的一个非常具体的问题,可能并不普遍适用。但是,既然你问...
                  【解决方案16】:

                  我在这里遇到同样的情况,上面没有任何帮助,更认真地检查我发现了我的问题,它包括在将一些输出发送到缓冲区后尝试做 die(header()),在代码中这样做的人忘记了关于 CakePHP 资源,并没有做简单的“return $this->redirect($url)”。

                  试图重新发明井,这就是问题所在。

                  我希望这对某人有所帮助!

                  【讨论】:

                    【解决方案17】:

                    一些可能对某人有所帮助的提示

                    fedora 20,php 5.5.18

                    public function testRead() {
                        $ri = new MediaItemReader(self::getMongoColl('Media'));
                    
                        foreach ($ri->dataReader(10) as $data) {
                           // ...
                        }
                    }
                    
                    public function dataReader($numOfItems) {
                        $cursor = $this->getStorage()->find()->limit($numOfItems);
                    
                        // here is the first place where "zend_mm_heap corrupted" error occurred
                        // var_dump() inside foreach-loop and generator
                        var_dump($cursor); 
                    
                        foreach ($cursor as $data) {
                            // ...
                            // and this is the second place where "zend_mm_heap corrupted" error occurred
                            $data['Geo'] = [
                                // try to access [0] index that is absent in ['Geo']
                                'lon' => $data['Geo'][0],
                                'lat' => $data['Geo'][1]
                            ];
                            // ...
                            // Generator is used  !!!
                            yield $data;
                        }
                    }
                    

                    使用 var_dummp() 实际上不是错误,它只是为了调试而放置的,将在生产代码中删除。但是真正发生 zend_mm_heap 的地方是第二个地方。

                    【讨论】:

                      【解决方案18】:

                      由于其他答案都没有解决这个问题,当我不小心运行了无限循环时,我在 php 5.4 中遇到了这个问题。

                      【讨论】:

                        【解决方案19】:

                        我在 PHP 5.5 下遇到了同样的错误,增加输出缓冲没有帮助。我也没有运行 APC,所以这不是问题。我终于找到了 opcache,我只需要从 cli 中禁用它。有一个特定的设置:

                        opcache.enable_cli=0
                        

                        一旦切换,zend_mm_heap 损坏错误就消失了。

                        【讨论】:

                        • 这里有同样的问题和解决方案!谢谢!
                        • 这篇文章的巨大加 1。我们尝试了一切,但最后,只有这个有效。
                        • 我相信您知道 cli 是 php 的命令行版本,它与用于 apache web 服务器的 php 模块无关,我很好奇使用 cli 禁用 opcache 有什么帮助? (我假设这发生在网络服务器上)
                        • @BioHazard,除了 cli,还有一般设置 opcache.enable=0。但这并没有必要帮助案件
                        • 这应该是这个问题的公认答案。根据 php.ini 中的文档,提高 output_buffering 不是答案,因为这会对您的网站或应用程序产生负面影响。
                        【解决方案20】:

                        我认为有很多原因会导致这个问题。在我的例子中,我将 2 个类命名为相同的名称,其中一个会尝试加载另一个。

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

                        在我的情况下它会导致这个问题。

                        (使用 laravel 框架,真实运行 php artisan db:seed)

                        【讨论】:

                          【解决方案21】:

                          我正在写一个 php 扩展,也遇到了这个问题。当我从我的扩展程序中调用具有复杂参数的外部函数时,会弹出此错误。

                          原因是我没有为 extern 函数中的参数(char *)分配内存。如果你写的是同类型的扩展,请注意这一点。

                          【讨论】:

                            【解决方案22】:

                            “zend_mm_heap 已损坏”表示内存管理问题。可能由任何 PHP 模块引起。 就我而言,安装 APC 成功了。理论上,其他软件包如 eAccelerator、XDebug 等也可能有所帮助。或者,如果您安装了此类模块,请尝试将其关闭。

                            【讨论】:

                              【解决方案23】:

                              我为这个问题苦苦挣扎了一周,这对我有用,或者至少看起来如此

                              php.ini 中进行这些更改

                              report_memleaks = Off  
                              report_zend_debug = 0  
                              

                              我的设置是

                              Linux ubuntu 2.6.32-30-generic-pae #59-Ubuntu SMP  
                              with PHP Version 5.3.2-1ubuntu4.7  
                              

                              这不起作用。

                              所以我尝试使用基准脚本,并尝试记录脚本挂起的位置。 我发现就在错误发生之前,实例化了一个 php 对象,完成该对象应该做的事情需要 3 多秒,而在之前的循环中最多需要 0.4 秒。我多次运行这个测试,每次都一样。我认为不是每次都创建一个新对象(这里有一个很长的循环),我应该重用该对象。到目前为止,我已经测试了十几次脚本,内存错误已经消失了!

                              【讨论】:

                              • 这工作了一段时间,但错误又回来了。我该如何阻止这种情况?
                              • 这对我来说同样适用于使用 MAMP PRO 2.1.1 的 mac 小牛。
                              • 此解决方案无法永久解决问题,我又开始收到此错误。
                              • 确定这只是关闭错误报告而不是解决问题?
                              【解决方案24】:

                              我认为这里没有一个答案,所以我将添加我的经验。我看到了同样的错误以及随机的 httpd 段错误。这是一个 cPanel 服务器。有问题的症状是 apache 会随机重置连接(在 chrome 中没有收到数据,或者在 Firefox 中重置了连接)。这些似乎是随机的——大部分时间它有效,有时却无效。

                              当我到达现场时,输出缓冲已关闭。通过阅读这个暗示输出缓冲的线程,我打开它(= 4096)看看会发生什么。此时,他们全部开始显示错误。这很好,因为该错误现在可以重复了。

                              我完成并开始禁用扩展程序。其中,eaccellerator、pdo、ioncube loader 以及许多看起来怀疑但没有帮助的东西。

                              我终于找到了“homeloader.so”这个顽皮的 PHP 扩展,它似乎是某种 cPanel-easy-installer 模块。删除后,我没有遇到任何其他问题。

                              就此而言,这似乎是一条通用错误消息,因此您的里程会因所有这些答案而异,您可以采取的最佳行动方案:

                              • 每次都使错误可重复(什么条件?)
                              • 求公因数
                              • 有选择地禁用任何 PHP 模块、选项等(或者,如果您很着急,请将它们全部禁用以查看是否有帮助,然后有选择地重新启用它们,直到它再次中断)
                              • 如果这没有帮助,这些答案中的许多都暗示它可能与代码有关。同样,关键是使错误可重复每个请求,以便您可以缩小范围。如果您怀疑某段代码正在执行此操作,那么再次,在错误可重复之后,只需删除代码,直到错误停止。一旦停止,您就知道您删除的最后一段代码是罪魁祸首。

                              以上所有方法都失败了,您还可以尝试以下方法:

                              • 升级或重新编译 PHP。希望导致您的问题的任何错误都已修复。
                              • 将您的代码移至不同的(测试)环境。如果这解决了问题,那么发生了什么变化? php.ini 选项? PHP版本?等等……

                              祝你好运。

                              【讨论】:

                                【解决方案25】:

                                对我来说,问题在于 memcached 守护进程崩溃,因为 PHP 被配置为在 memcached 中存储会话信息。它正在吃 100% 的 cpu,表现得很奇怪。 memcached重启后问题消失了。

                                【讨论】:

                                  【解决方案26】:

                                  在 PHP 5.3 上,经过大量搜索,这是对我有用的解决方案:

                                  我为此页面添加了disabled the PHP garbage collection

                                  <? gc_disable(); ?>
                                  

                                  到有问题的页面的末尾,这使得所有错误都消失了。

                                  source.

                                  【讨论】:

                                    【解决方案27】:

                                    我在使用 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')); 
                                    

                                    ^^ 工作! (?!)

                                    【讨论】:

                                    • 这个答案帮助我调试,继续 Mongo 问题路径。在我的例子中,PHP 5.6 + Mongo 1.6.9 驱动程序,当从先前通过foreach(selectCollection()-&gt;find()) { $arr = .. }填充的数组中迭代和查询值时抛出 zend_mm_heap 损坏消息@
                                    【解决方案28】:

                                    设置

                                    assert.active = 0 
                                    

                                    在 php.ini 中对我有帮助(它关闭了 php5UTF8 库中的类型断言并且 zend_mm_heap corrupted 消失了)

                                    【讨论】:

                                      【解决方案29】:

                                      在 PHP 5.2+ 中运行使用“&”显式强制引用的旧代码时,我也注意到了这个错误和 SIGSEGV。

                                      【讨论】:

                                        【解决方案30】:

                                        我已经尝试了上述所有方法和 zend.enable_gc = 0 - 唯一对我有帮助的配置设置。

                                        带有 Suhosin-Patch (cli) 的 PHP 5.3.10-1ubuntu3.2(构建时间:2012 年 6 月 13 日 17:19:58)

                                        【讨论】:

                                          猜你喜欢
                                          • 2012-02-17
                                          • 1970-01-01
                                          • 2013-01-31
                                          • 1970-01-01
                                          • 2016-01-28
                                          • 2016-01-15
                                          • 2017-08-20
                                          • 2014-03-23
                                          • 1970-01-01
                                          相关资源
                                          最近更新 更多