必须双路径缓存vendor/和~/.composer/cache:仅缓存vendor/因PHP版本等差异致autoload不兼容,仅缓存cache仍需重复解压写文件;CI中需排除vendor/bin/和vendor/autoload.php,并用PHP版本区分cache路径。

Composer 缓存路径设不对,CI 构建就变“下载大会”,本地 install 也慢得像在等包邮——根本原因不是网络差,而是缓存没落盘、路径被清空、或多项目共用一个 cache-dir 导致读写冲突。
如何确认当前生效的 Composer 缓存路径
别猜,直接问 Composer:
- 运行
composer config --global cache-dir,它会输出当前配置值;没配过就显示默认路径(Linux/macOS 是~/.composer/cache,Windows 是%APPDATA%\Composer\cache) - 注意:
~是 shell 符号,Composer 不解析它;composer config --global cache-dir ~/my-cache会失败,必须写绝对路径,比如/home/user/my-composer-cache - 路径必须存在且当前用户有读写权限,否则后续
composer install会报错:file_put_contents(/path/to/cache/repo/https---packagist.org/packages.json): failed to open stream
改缓存路径时最容易踩的三个坑
改路径本身很简单,但以下三点不注意,轻则缓存失效,重则 CI 构建失败:
-
旧缓存不会自动迁移:改完
cache-dir后,Composer 直接往新路径写,旧目录里的files/、repo/全部作废,得手动rsync -a ~/.composer/cache/files/ /new/path/files/或直接删掉旧缓存 -
CI 环境别用
config --global:容器生命周期短,改了也白改;应优先用环境变量COMPOSER_CACHE_DIR=/cache/composer-php8.2,它比 config 配置优先级更高,且可动态组合 PHP 版本、Composer 版本做隔离 -
别把缓存挂到
/tmp或 NFS 卷:某些系统定期清理/tmp;NFS 延迟高、锁机制弱,容易出现repo/JSON 文件读到一半就被另一个 job 覆盖,导致Package not found类错误
CI 中精准命中缓存的关键:只缓存 files/ 子目录 + lock 哈希做 key
~/.composer/cache 整体缓存是错的,真正需要持久化的是其中的 files/ 目录——它存的是所有已下载的 zip/tar 包。其他子目录(如 repo/、vcs/)可丢,重生成很快。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
立即学习“PHP免费学习笔记(深入)”;
- GitHub Actions 推荐写法:
path: ~/.composer/cache/files,key 用${{ hashFiles('**/composer.lock') }},lock 文件一变,缓存自动失效,避免版本错乱 - GitLab CI 必须显式列出:
paths: [ "~/.composer/cache/files" ],只写~/.composer/cache无效,因为 GitLab 的 cache 机制不递归同步子目录 - Docker 场景下,记得把新路径加进
VOLUME或 bind mount,否则容器退出后缓存全丢;例如-v $HOME/composer-cache-php8.2:/root/.composer/cache
缓存目录放哪儿才真快?SSD 是底线,别碰网络存储
缓存路径的位置直接影响 composer install 的 I/O 性能。实测数据:同一台机器,缓存放在 NVMe SSD vs 普通 SATA SSD,install 时间相差 15–20%;放在 NFS 上则慢 3 倍以上。
- 开发机建议设到本地 SSD:
composer config --global cache-dir /mnt/ssd/composer-cache - CI runner 若支持本地磁盘,优先用
/runner-cache/composer这类路径,而非/home/runner/.composer/cache(后者可能在慢速分区) - 容器内若无法挂载 SSD,至少避开
/tmp和/dev/shm:前者可能被定时清理,后者大小受限且重启即失
缓存路径优化不是“设个目录就完事”,核心在于让 files/ 存得住、读得快、不串味——尤其在多 PHP 版本、多 Composer 版本混用的场景下,路径隔离和挂载方式比参数调优更关键。


















