You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Sail升级PHP 8.4后运行PHPUnit测试出现zend_mm_heap corrupted错误

环境信息

  • PHP: 8.4.1
  • Laravel: 11.35.1
  • Sail: 1.39.1
  • PHPUnit: 10.5.39
  • macOS: 15.1.1 (24B91)

我们正从PHP 8.2升级到PHP 8.4,目前仅在Laravel Sail中升级了PHP并重建了Docker镜像。

查看版本信息显示正常:

% sail php -v
PHP 8.4.1 (cli) (built: Nov 25 2024 18:04:19) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.4.1, Copyright (c) Zend Technologies
with Zend OPcache v8.4.1, Copyright (c), by Zend Technologies
with Xdebug v3.4.0, Copyright (c) 2002-2024, by Derick Rethans

但运行PHPUnit测试时(约100个测试成功后)出现以下错误:

% sail test

zend_mm_heap corrupted

   Symfony\Component\Process\Exception\ProcessSignaledException 

  The process has been signaled with signal "6".

  at vendor/symfony/process/Process.php:462
    458▕             usleep(1000);
    459▕         }
    460▕ 
    461▕         if ($this->processInformation['signaled'] && $this->processInformation['termsig'] !== $this->latestSignal) {
  ➜ 462▕             throw new ProcessSignaledException($this);
    463▕         }
    464▕ 
    465▕         return $this->exitcode;
    466▕     }

      +15 vendor frames 

  16  artisan:13
      Illuminate\Foundation\Application::handleCommand()

问题详情

该错误似乎与特定测试用例无关,更偏向内存问题,但尚未完全确认。zend_mm_heap corrupted提示PHP内存管理器可能存在异常。

已尝试操作

  • 重建Laravel Sail Docker容器
  • 确认PHP、Laravel和PHPUnit版本均为最新

更新(2024年12月16日)

切换到SQLite并通过Laravel Herd运行测试,结果一致:

  • PHP 8.2.26:运行正常
  • PHP 8.3.14:运行正常
  • PHP 8.4.1:运行失败(出现相同错误)

调试与解决建议

1. 禁用OPcache测试

zend_mm_heap corrupted常与OPcache冲突有关,尤其是PHP大版本升级后。先临时禁用OPcache:

  • 在Sail的PHP配置文件(通常是docker/8.4/php.ini)中添加或修改:
    opcache.enable=0
    
  • 重启Sail容器:sail down && sail up -d
  • 重新运行测试,看是否还会报错。

2. 调整PHP内存限制

测试过程中内存溢出也可能导致堆损坏,尝试提高内存限制:

  • 在php.ini中修改:
    memory_limit=2G
    
  • 或者直接在运行测试时指定:sail php -d memory_limit=2G vendor/bin/phpunit

3. 排查Xdebug干扰

Xdebug 3.4与PHP 8.4可能存在兼容性问题,临时禁用Xdebug测试:

  • 在Sail的PHP配置中添加:
    xdebug.mode=off
    
  • 重启容器后重新运行测试。

4. 逐步排查测试用例

虽然看起来不是特定测试的问题,但可以分批运行测试,定位是否有某个测试触发了堆损坏:

  • 先运行前50个测试:sail test --filter '^test.*$' --stop-on-error
  • 逐步扩大范围,找到可能触发问题的测试块,检查是否有内存泄漏、非标准资源操作(比如自定义扩展、FFI调用)。

5. 检查PHP扩展兼容性

确认项目中使用的所有PHP扩展都支持PHP 8.4:

  • 运行sail php -m列出已加载的扩展,逐一排查每个扩展的最新版本是否兼容PHP 8.4。
  • 尤其是自定义扩展、第三方非官方扩展,可能存在未适配的内存管理逻辑。

6. 尝试更新PHP到最新小版本

PHP 8.4.1可能存在已知的内存管理bug,后续小版本可能修复:

  • 升级Sail的PHP版本到最新可用的8.4.x版本,重建镜像后测试。

内容的提问来源于stack exchange,提问作者alexmcfarlane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:37:14