Composer缓存过期时间分三类独立控制:cache-ttl管packages.json元数据(默认600秒),cache-files-ttl管ZIP/TAR包(默认6个月),cache-vcs-ttl管Git克隆(默认15分钟),改错配置无效。

Composer 缓存过期时间不是单个配置能搞定的,它分三类独立控制:元数据(packages.json)、dist 包(ZIP/TAR)、VCS 克隆(Git 仓库),改错地方根本没用。
cache-ttl 控制的是 packages.json 缓存,不是 ZIP 包
你改了 cache-ttl 却发现 composer update 还是不拉新 tag?大概率是因为混淆了「元数据」和「代码包」。这个配置只决定 Composer 是否重新请求 https://repo.packagist.org/packages.json(或你的镜像源),默认值是 600(10 分钟)。它不影响已下载的 ZIP 文件是否复用——那是 cache-files-ttl 的事。
- 开发中想立刻看到私有仓库新 tag?光调
cache-ttl不够,还得清元数据缓存:composer clear-cache或手动删$COMPOSER_HOME/cache/repo/https---mirrors.aliyun.com-composer/ - 设太小(比如
1)会导致每次命令都重请求,Packagist 或镜像站可能返回429 Too Many Requests - 对私有仓库也生效,但前提是对方响应头没带更强的
Cache-Control指令
cache-files-ttl 才管 ZIP/TAR 包要不要重下
如果你发版后 composer install 仍装旧代码,问题八成出在 cache-files-ttl。它控制本地缓存的 dist 包(.zip、.tar)“保质期”,默认 15552000(6 个月)。哪怕远程包已更新,只要本地 ZIP 没过期,Composer 就直接解压它。
- 全局设为 1 天:
composer config -g cache-files-ttl 86400 - 项目级覆盖(写入
composer.json):"config": {"cache-files-ttl": 3600} - 临时生效(仅本次):
COMPOSER_CACHE_FILES_TTL=3600 composer install - 注意:它不清理磁盘,只让 Composer 在下次安装时跳过过期缓存——真要立刻生效,得配合
composer clear-cache或等自然过期
私有 Git 仓库依赖走的是 cache-vcs-ttl
用 "git@xxx:vendor/pkg.git" 这种方式声明的依赖,不受 cache-ttl 和 cache-files-ttl 管——它们走的是 VCS 缓存机制,默认 900(15 分钟)。你 push 了新 commit,composer update 却还 checkout 旧版本,就是它在起作用。
- 查看当前值:
composer config --list | grep cache-vcs-ttl - 设为 5 分钟:
composer config cache-vcs-ttl 300(项目级)或composer config -g cache-vcs-ttl 300(全局) - 注意:VCS 缓存目录在
$COMPOSER_HOME/cache/vcs/,里面是完整的git clone副本,改 ttl 不会自动删旧克隆,只影响下次是否复用
验证配置是否真生效,别只信 composer config --list
composer config --list 只显示配置值,不反映实际行为。真正要看的是 Composer 请求时的日志输出:
- 加
-v参数运行命令,观察是否出现Downloading https://...(说明元数据被刷新)或Downloading .../archive/...(说明 ZIP 被重下) - 检查缓存目录时间戳:
ls -la $COMPOSER_HOME/cache/repo/https---repo.packagist.org/和$COMPOSER_HOME/cache/files/下文件的mtime - 临时把
cache-files-ttl设极小(如1),再跑composer install,看是否每次都重下 ZIP —— 如果没有,说明配置没落到正确位置(比如误写进项目根目录的config.json,Composer 不认)
最常被忽略的点:缓存行为受多层叠加影响(命令行 > 项目 composer.json > 全局 config),且每类缓存都有独立生命周期。调一个参数就想解决所有“不更新”问题,基本都会踩坑。


















