必须只缓存~/.composer/cache并绑定php版本与composer.lock哈希,禁用vendor缓存以防autoloader路径硬编码导致class not found;配合--no-dev、--prefer-dist及四层门禁确保多版本测试快、稳、准。

用 GitHub Actions 做 PHP 多版本兼容测试,光靠跑矩阵还不够——依赖安装慢、重复下载、环境不一致,都会拖垮效率甚至掩盖真实问题。关键不是“多跑几个版本”,而是让每个版本都快、稳、准地跑起来。
缓存策略:只缓存 ~/.composer/cache,别碰 vendor/
直接缓存 ./vendor 看似省事,但 Composer 生成的 autoloader 文件里硬编码了构建时的绝对路径。CI 每次新建容器,路径一变,就会报 Class not found 或 failed to open stream。真正该缓存的是 Composer 自己的下载缓存:
- 缓存路径固定为
~/.composer/cache(setup-php 会自动创建并授权) - 缓存 key 必须同时包含:
composer-${{ hashFiles('**/composer.lock') }}-php-${{ matrix.php-version }} - 加
restore-keys提升容错性,例如:composer-${{ hashFiles('**/composer.lock') }}- - 必须放在
setup-php之后、composer install之前
PHP 版本矩阵与缓存绑定
不同 PHP 大版本下,Composer 解析依赖的行为可能不同(比如对联合类型、扩展兼容性的处理)。如果所有版本共用同一份缓存,8.1 装好的包在 8.2 下可能跳过或报错。所以:
- matrix.php-version 每个值都要参与缓存 key 构建
- 避免用
${{ runner.os }}或时间戳等不稳定因子作为 key 后缀 - 若项目含多个子模块(如
api/composer.lock和web/composer.lock),需分别缓存,key 加前缀区分
加速安装的实操细节
缓存只是第一步,安装命令本身也影响速度和稳定性:
- 始终加
--no-interaction --prefer-dist --optimize-autoloader - CI 中一般不需要 dev 依赖,显式加
--no-dev可减少 30%–60% 安装时间 - 私有仓库依赖要提前配 Git 凭据,否则缓存命中后仍会卡在
Cloning into ... - 推荐用
php-actions/composer@v6替代系统自带 composer,版本可控、无兼容隐患
配合四层门禁,让缓存不成为盲区
缓存加快了流程,但不能绕过兼容性检查。多版本测试的价值,在于每层验证都在对应 PHP 环境下真实执行:
- 语法校验(
php -l)必须在当前 matrix.php-version 下运行 - PHPCompatibility 扫描需指定
--runtime-set php_version 7.4模拟低版本语义 - PHPStan 分析要带
--autoload-file=vendor/autoload.php,确保加载的是该版本下生成的 autoloader - PHPUnit 必须在每个 PHP 版本中独立执行,不能复用上一轮的
vendor/
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











