GitHub Actions运行Laravel功能测试时PHP内存耗尽错误如何解决
GitHub Actions 运行Laravel功能测试内存耗尽问题排查方案
问题现状
本地执行Laravel功能测试可全量通过,触发GitHub Actions工作流后,在执行750个功能测试的过程中,跑到总进度16%时触发PHP致命错误:CI环境默认的1G内存上限(对应报错中的1073741824字节)耗尽,报错定位在Symfony Routing组件的路由编译环节,无法完成测试流程。
可落地的调整操作
1. 直接调整测试执行环节的PHP内存限制
GitHub Actions运行器的默认PHP配置中memory_limit为1G,在加载完整Laravel应用、批量编译路由的场景下很容易触顶,不需要修改全局PHP配置,直接在执行PHPUnit命令时临时调高内存上限即可:
- 将原有执行PHPUnit的命令
修改为带内存参数的写法:- name: Execute Feature tests via PHPUnit run: vendor/bin/phpunit --testsuite Feature- name: Execute Feature tests via PHPUnit run: php -d memory_limit=4G vendor/bin/phpunit --testsuite Feature - GitHub Actions的Linux运行环境宿主机有足够的内存支撑4G的配置上限,不会出现宿主机资源不足的问题。
2. 优化工作流配置,减少无意义的内存消耗
现有配置存在几个会推高内存峰值的设置,调整后可以明显降低内存占用:
- 将setup-php步骤里的Composer版本从v1调整为v2,Composer v2的自动加载机制比v1节省30%左右的运行时内存:
- uses: shivammathur/setup-php@v2 with: php-version: '7.3' extensions: gd, mysql tools: composer:v2 - 依赖安装环节增加权威类映射参数,减少运行时自动加载的内存开销,修改安装命令为:
- name: Install Dependencies run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist --classmap-authoritative - 执行测试前增加Laravel运行缓存清理步骤,避免旧缓存加载带来的额外内存占用:
- name: Clear Laravel runtime cache run: | php artisan route:clear php artisan config:clear php artisan cache:clear
3. 特殊场景下的内存兜底方案
如果调整完内存上限后仍出现内存峰值过高的问题,可以开启PHPUnit的进程隔离模式,让每个测试文件执行完后自动释放内存,避免单进程内存持续累积:
- 对应的执行命令调整为:
- name: Execute Feature tests via PHPUnit run: php -d memory_limit=2G vendor/bin/phpunit --testsuite Feature --process-isolation - 注意不要将
memory_limit设置为-1(无内存限制),否则如果出现内存无限膨胀的情况,会触发GitHub Actions运行器的OOM机制直接终止任务,反而导致测试失败。
内容的提问来源于stack exchange,提问作者Connor Leech
相关产品推荐
相关产品推荐

