cache-ttl控制packages.json元数据刷新,决定composer update能否发现新版本;cache-files-ttl控制ZIP包复用,决定实际安装代码是否最新;cache-vcs-ttl管理Git克隆缓存,三者独立且单位均为秒。

cache-ttl 控制 packages.json 元数据是否刷新
改 cache-ttl 是为了让你的 composer update 能及时看到新发布的包版本(比如新 tag、新 minor 版本),但它只管「远程包列表」要不要重拉,不管实际装哪个 ZIP 文件。默认值是 600(10 分钟),意味着 Composer 会复用本地缓存的 packages.json 最多 10 分钟,期间即使镜像站已更新,它也看不到。
常见错误现象:
- 你在私有 Git 仓库打了新 tag,
composer update vendor/pkg却说 “Nothing to install or update” → 很可能cache-ttl没过期,旧元数据还在用 - 改了
cache-ttl为30,但命令执行时没见Downloading https://mirrors.aliyun.com/composer/packages.json→ 配置没生效,或被更高优先级配置覆盖
实操建议:
- 开发中想秒级感知新版本:设
composer config -g cache-ttl 30(全局)或composer config cache-ttl 30(项目级) - 设太小(如
1)会导致每条命令都触发请求,Packagist 或镜像站可能返回429 Too Many Requests,本地也会卡在 “Loading from cache” - 必须配合清元数据缓存才真正生效:
composer clear-cache,或手动删$COMPOSER_HOME/cache/repo/https---mirrors-aliyun-com-composer/下的packages.json - 验证是否起效:加
-v运行composer update -v,观察日志里是否出现Downloading https://...行
cache-files-ttl 决定 ZIP 包是否重下
你发版后 composer install 还是装旧代码?问题大概率出在 cache-files-ttl。它控制的是本地已下载的 dist 包(.zip、.tar)“保质期”,默认 15552000(6 个月)。哪怕远程包已更新,只要本地 ZIP 没过期,Composer 就直接解压它,不走网络。
实操建议:
- 日常开发推荐设为
86400(24 小时):composer config -g cache-files-ttl 86400 - 高频发版环境可设为
3600(1 小时):COMPOSER_CACHE_FILES_TTL=3600 composer install(仅本次) - 它不自动清理磁盘,只让 Composer 在下次安装时跳过过期缓存;要立刻生效,得配
composer clear-cache或等自然过期 - 注意:
cache-files-ttl不影响 Git 依赖,私有仓库走的是cache-vcs-ttl
cache-vcs-ttl 管私有 Git 仓库克隆行为
用 "git@xxx:vendor/pkg.git" 这种方式声明的依赖,完全不受 cache-ttl 和 cache-files-ttl 影响。它走的是 VCS 缓存机制,默认 900(15 分钟),缓存目录在 $COMPOSER_HOME/cache/vcs/,里面是完整的 git clone 副本。
常见错误现象:
- push 新 commit 后,
composer update仍 checkout 旧 commit →cache-vcs-ttl没过期 - CI 流水线每次都在重新 clone 私有仓库,拖慢构建 → 可能被误设为
0或极小值
实操建议:
- 查看当前值:
composer config --list | grep cache-vcs-ttl - 设为 5 分钟(项目级):
composer config cache-vcs-ttl 300 - 改完不删旧克隆,只影响下次是否复用;真要强制更新,删对应子目录或跑
composer clear-cache - 注意:VCS 缓存路径和元数据缓存路径不同,别混淆
cache/vcs/和cache/repo/
验证配置是否真生效,别只信 composer config --list
composer config --list 只显示配置值,不反映真实行为。Composer 请求时的日志输出才是唯一可靠依据。
实操建议:
- 加
-v或-vv运行命令:composer update -v 2>&1 | grep "Downloading\|Fetching" - 看到
Downloading https://.../packages.json→cache-ttl已过期 - 看到
Downloading vendor/package/version.zip→cache-files-ttl已过期 - 看到
Cloning git@xxx...或Updating git@xxx...→cache-vcs-ttl已过期 - 注意:如果用了
--refresh(Composer ≥ 2.5),它会强制丢弃所有packages.json缓存,但不碰 ZIP 和 VCS 缓存,是最轻量的元数据刷新方式
三类缓存独立运作,改错地方等于没改;优先级是命令行参数 > 项目 composer.json > 全局 config;路径、格式、单位(秒)写错一个,Composer 就静默忽略。


















