COMPOSER_CACHE_DIR环境变量优先级最高,决定composer update是否跳过重复下载;它控制一级缓存(files/等临时工件),而cache-dir仅影响二级元数据缓存且会被其覆盖。

Composer update 的缓存文件位置由 COMPOSER_CACHE_DIR 环境变量决定,而非 COMPOSER_HOME 或 cache-dir 配置项——设错会导致每次 update 都重下包,不是变慢,是彻底绕过缓存。
为什么 COMPOSER_CACHE_DIR 比 cache-dir 配置更关键
Composer 的缓存分两级:一级是下载/解压/安装过程中的临时工件(zip、tar、installer 脚本),二级才是 cache-dir 里存的元数据(repo/、vcs/)。composer update 是否跳过重复下载,取决于第一级缓存是否命中。cache-dir 配置只影响第二级,且会被 COMPOSER_CACHE_DIR 完全覆盖。
-
COMPOSER_CACHE_DIR未设置时,Composer 自动 fallback 到$COMPOSER_HOME/cache(即默认~/.composer/cache) - 一旦设置了
COMPOSER_CACHE_DIR,所有缓存文件(包括 files/、repo/、vcs/)都写入该路径,cache-dir配置被忽略 - 常见误操作:只改了
composer config --global cache-dir /new/path,但没设环境变量 → 缓存仍写在旧位置,update 还是慢
如何正确设置 COMPOSER_CACHE_DIR 并验证生效
必须通过操作系统环境变量设置,不能靠 Composer 命令配置。Docker、CI 或多用户环境尤其容易漏掉这点。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- Linux/macOS:在
~/.zshrc或~/.bash_profile中添加export COMPOSER_CACHE_DIR="/mnt/ssd/composer-cache",然后source ~/.zshrc - Windows:用系统属性 → “高级” → “环境变量” 添加用户变量
COMPOSER_CACHE_DIR,值为%USERPROFILE%\AppData\Local\Composer\Cache - 验证是否生效:
echo $COMPOSER_CACHE_DIR(Linux/macOS)或echo %COMPOSER_CACHE_DIR%(Windows),再运行composer config --global cache-dir—— 它可能还显示旧路径,但实际缓存已写入COMPOSER_CACHE_DIR - 终极验证:删掉旧缓存目录,执行
composer update -v,观察日志中Writing into cache...后面的路径是否为你指定的位置
COMPOSER_CACHE_DIR 设错的典型错误现象
缓存失效往往不报错,而是静默退化为“无缓存模式”,表现非常隐蔽:
- 每次
composer update都卡在Downloading https://.../package.zip,哪怕包版本没变 - 日志里反复出现
Failed to create cache directory: Permission denied,此时 Composer 会 fallback 到内存缓存(极慢)或直接跳过缓存 - Docker 构建中设成
/tmp/composer-cache,容器重启后目录丢失 → 缓存永远为空 - 路径含空格或中文(如
/Users/张三/composer-cache)→ 某些 Composer 版本解析失败,静默使用默认路径
配合 cache-files-ttl 控制缓存寿命
即使路径正确,缓存文件也可能因过期被自动清理,导致重复下载。关键参数是 cache-files-ttl,它控制 zip/tar 包缓存的有效时间,默认 6 个月(15552000 秒)。
- 查当前值:
composer config --global cache-files-ttl - 调高(比如设为 1 年):
composer config --global cache-files-ttl 31536000 - 注意:这个值只对
files/下的压缩包有效,不影响repo/元数据;后者需手动清理或等 Composer 自动刷新(通常 30 天) - 如果项目长期不更新,但又依赖某些已归档的老包,建议调高此值,避免因 TTL 到期触发重下载
真正难搞的不是设路径,而是确认它**正在被用**——很多团队改完环境变量就以为万事大吉,结果日志里还在往 ~/.composer/cache 写,因为 shell 配置没 reload,或者 CI 脚本里根本没 export。每次怀疑缓存失效,先跑一遍 echo $COMPOSER_CACHE_DIR 和 composer update -v | grep "cache\|Writing",比清缓存有用十倍。

















