Composer元数据缓存(packages.json等)硬编码为15分钟且不可调;clear-cache不清理该缓存,需用--refresh或手动删除cache/repo/目录,并注意composer.lock影响。

composer update 的缓存过期时间不能调整——尤其是元数据(packages.json、provider-*.json)的缓存,是硬编码为 15 分钟,任何配置、环境变量或命令行参数都改不了。
你看到“更新不及时”,大概率不是缓存没过期,而是本地缓存还没被强制刷新,或者镜像源本身还没同步。
packages.json 元数据缓存为什么删了 composer clear-cache 还没用
-
composer clear-cache只清~/.composer/cache/files/(ZIP 包)和vcs/(Git 克隆),完全不碰元数据目录 - 真正决定“能装什么版本”的是
~/.composer/cache/repo/https---mirrors-aliyun-com-composer/packages.json和一堆provider-*.json - 这些文件只要磁盘时间戳在 15 分钟内,Composer 就直接读本地,绝不发 HTTP 请求,哪怕镜像站已同步、远程已有新包
-
composer config --global cache-files-ttl控的是 ZIP 包缓存(默认 6 个月),和元数据无关
怎么让 composer update 立刻拉最新元数据
唯一轻量、精准、官方支持的方式是:
- 使用
composer update --refresh(仅 Composer ≥ 2.5)
它只删repo/下的packages.json和所有provider-*.json,强制重拉索引,但保留已下载的 ZIP 包
其他等效但更粗暴的操作(适用于旧版 Composer 或想彻底重来):
-
rm -rf $(composer config --global cache-dir)/repo/https---mirrors-aliyun-com-composer/ - 再运行
composer update(它会重建整个 repo 目录) - Windows 用户注意:
$(composer config --global cache-dir)在 PowerShell 中需加.Trim(),或直接用$env:APPDATA\Composer\Cache\repo\https---mirrors-aliyun-com-composer\
别信 --no-cache 或 --ignore-platform-reqs,它们对元数据刷新毫无作用。
验证元数据是否真刷新了
跑这句,盯输出:
composer update --dry-run -v
- 如果看到
Downloading @#@#@#@#@#@#@#@#@#@0,说明成功触发了重拉 - 如果只看到
Reading /path/to/cache/packages.json,说明缓存没清干净,得回去再删一次 repo 目录
最容易漏掉的是:你清了元数据,但 composer.lock 还在,update 仍会按锁文件锁定旧版本——该删还得删。
真正卡住你的,从来不是“缓存多久过期”,而是“缓存有没有被正确清掉”和“锁文件有没有被绕过”。这两处不动,调任何 timeout、ttl、mirror 都白搭。











