验证 composer 缓存是否真命中需执行 composer install --no-interaction --dry-run --prefer-dist -v 2>&1 | grep -e "(downloading|unpacking|installing)",若输出含 "downloading" 或 "unpacking" 则未命中,仅含 "installing ... from cache" 且路径为 ~/.composer/cache/files/... 才为真命中。

缓存没命中,不是 Composer 没开缓存,而是 CI 环境里它根本没用上 ~/.composer/cache 里的 ZIP 文件——日志里出现 Downloading 或 Unpacking 就是铁证。
怎么验证 CI 中 Composer 缓存是否真命中?
别信 Cache hit 这种模糊提示,GitHub Actions 的缓存动作成功 ≠ Composer 实际用了缓存。真正指标是看它跳过了 ZIP 解压步骤。
- 在
composer install前加一行验证命令:composer install --no-interaction --dry-run --prefer-dist -v 2>&1 | grep -E "(Downloading|Unpacking|Installing)" - 输出含
Downloading https://...或Unpacking /tmp/xxx.zip→ 缓存未命中 - 只输出类似
Installing vendor/name (1.2.3): from cache且路径是~/.composer/cache/files/...→ 真命中 -
--dry-run不写vendor/,但完整走依赖解析和缓存查检流程,安全又准
缓存 key 为什么总不匹配?
90% 是 composer.lock 内容在 CI 和本地不一致——不是 Git 没提交,而是你本地跑了 composer update 却没 git add composer.lock && git commit。
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
- CI 里
hashFiles('**/composer.lock')算出来的是空哈希或旧哈希,缓存系统自然 miss - 验证方法:CI job 开头加
sha256sum composer.lock,对比本地输出,必须一字不差 - monorepo 项目慎用
**/composer.lock:GitHub Actions 的hashFiles只取第一个匹配项,应改用hashFiles('path/to/your/composer.lock') - 换行符差异(CRLF vs LF)也会导致哈希不同,确保
.gitattributes有* text=auto eol=lf
该缓存 vendor/ 还是 ~/.composer/cache?
缓存 vendor/ 多数时候是错的——Composer autoloader 里硬编码了绝对路径,CI 容器重建后路径失效,运行时报 Class not found。
- 真正该缓存的是
~/.composer/cache:含已下载的 ZIP、dist tarball、metadata(含哈希校验) -
vendor/每次用composer install --no-interaction --prefer-dist重建,靠软链快速生成 - 缓存 key 必须含
composer.lock哈希 + PHP 版本,例如:composer-${{ hashFiles('**/composer.lock') }}-php-${{ matrix.php-version }} - 别用
${{ runner.os }}做 key 后缀——Linux/macOS 下~/.composer/cache结构一致,没必要区分
为什么 setup-php + php-actions/composer 是当前最稳组合?
直接写 composer install 必然失败:ubuntu-latest 镜像默认无 PHP,更没有 Composer;不是配置错,是根本不存在。
-
shivammathur/setup-php@v2只装 PHP 和扩展(mbstring,xml,zip,pdo,curl必须显式写全),不附带 Composer -
php-actions/composer@v6按当前 PHP 版本下载对应二进制、跳过全局安装、自动校验composer.json格式,支持指定版本如composer-version: '2.5.8' - 别在
run步骤里写sudo apt install composer:Ubuntu 包常是 2.0.x,且不保证启用ext-zip等必需扩展 - 手动
curl装容易绕过缓存、校验缺失,还可能因 TLS 或镜像源不稳定中断
复杂点在于:缓存 key 要同时绑定 lock 文件内容、PHP 版本、甚至 Composer 版本;而 ~/.composer/cache 目录权限、Git 凭据缺失、VCS 缓存未启用,都会让“已恢复缓存”变成“假装命中”。










