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
相关产品推荐
相关产品推荐

