Github Actions搭配PHPUnit与MySQL运行测试速度极慢问题求助
GitHub Actions MySQL + PHPUnit 运行缓慢优化方案
核心问题根因
你遇到的速度问题基本来源于默认MySQL容器的磁盘IO瓶颈:官方MySQL镜像默认开启了完整的事务持久化校验,所有数据写入都会强制刷盘,同时数据目录挂载在宿主机机械/云硬盘上,IO性能极低,导致每个数据库操作耗时被拉长数十倍。
优化方案
1. 调整MySQL服务配置,规避IO瓶颈
给MySQL服务新增内存挂载、关闭不必要的持久化校验,直接把数据库运行在内存中,测试结束后自动销毁数据,完全符合CI场景需求:
services: mysql: image: mysql:5.6 env: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: testing ports: - 33306:3306 # 将MySQL数据目录挂载到内存tmpfs,完全跳过磁盘IO tmpfs: - /var/lib/mysql options: >- --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 --entrypoint sh -c " mysqld --skip-innodb-flush-log-at-trx-commit --sync-frm=0 --innodb_flush_method=O_DIRECT_NO_FSYNC --innodb_buffer_pool_size=1G "
2. 补全并优化工作流执行步骤
你当前贴出的精简配置缺少代码检出、依赖安装等必要步骤,完整配置建议增加依赖缓存、关闭不必要的调试特性进一步提速:
steps: - name: 检出代码 uses: actions/checkout@v4 - name: 配置PHP环境 uses: shivammathur/setup-php@v2 with: php-version: '替换为你的项目实际PHP版本' extensions: mbstring, xml, ctype, json, mysqlnd, pdo_mysql coverage: none # 无覆盖率统计需求时务必关闭,可减少30%以上的测试耗时 - name: 缓存Composer依赖 uses: actions/cache@v3 with: path: vendor key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-composer- - name: 安装项目依赖 run: composer install --prefer-dist --no-progress --no-interaction - name: 执行测试 run: vendor/bin/phpunit env: DB_PORT: 3306 DB_USERNAME: root DB_PASSWORD: password DB_DATABASE: testing DB_HOST: mysql
3. PHPUnit 侧适配优化
- 拆分测试类型:单元测试优先使用内存SQLite运行,仅需要MySQL特性的集成测试才连接数据库
- Laravel项目开启
RefreshDatabasetrait的事务回滚特性,避免每个测试用例都重建表结构 - 关闭PHPUnit的进程隔离配置,避免每个测试用例都启动新的PHP进程
内容的提问来源于stack exchange,提问作者Keiron Lowe
相关产品推荐
相关产品推荐

