Composer update不刷新缓存,本质是远程元数据、本地repo缓存、composer.lock和installed.json四层不同步;仅clear-cache无效,必须依次清理cache/repo/https---packagist.org/、installed.json和composer.lock,并验证是否重载packages.json。

Composer 的 update 命令本身不刷新缓存,它默认复用本地元数据和 composer.lock;所谓“损坏的 update 缓存”,本质是四层信息不同步:远程元数据过期、本地 repo 缓存陈旧、composer.lock 锁死旧版、vendor/composer/installed.json 快照失真。只跑 composer clear-cache 几乎没用。
为什么 composer clear-cache 不能修复 update 滞后
composer clear-cache 只清 ~/.composer/cache/files/(ZIP 包)和部分索引,但不会动 ~/.composer/cache/repo/https---packagist.org/ 下的 packages.json 和 provider-*.json——而这些才是决定“有哪些新版本”的元数据根。你删完缓存再 update,它仍会读这个目录里的旧快照,根本“看不见” Packagist 上刚发的 v2.1.0。
- 现象:
composer update显示Nothing to install or update,但composer show vendor/package查不到最新版 - 验证方法:
composer update --dry-run -v,如果输出里只有Reading /path/to/cache/packages.json,说明元数据没重拉 - 根本原因:Composer 不把
packages.json当“可缓存资源”,而是当“权威快照”,除非你手动删掉整个repo/https---packagist.org/目录,否则它不会主动更新
必须手动清理的三处关键位置
这三处缺一不可,顺序也不能乱:先清基础缓存,再清元数据根目录,最后清本地状态文件。漏掉任意一个,update 都可能继续走捷径。
- 运行
composer clear-cache(清 ZIP 和基础索引) - 删元数据缓存:
rm -rf $(composer config --global cache-dir)/repo/https---packagist.org/(Linux/macOS)或rd /s /q "%APPDATA%\Composer\Cache\repo\https---packagist.org\"(Windows) - 删本地快照:
rm -f vendor/composer/installed.json composer.lock(注意:不是只删vendor/,installed.json在里面)
做完这三步,再跑 composer update --dry-run -v,看到 Downloading https://packagist.org/packages.json 或 Curl GET https://... 才算真正重载元数据。
Corrupted zip file 错误不能靠 clear-cache 解决
这类报错(如 Corrupted zip file: monolog/monolog)不是 metadata 问题,而是 ~/.composer/cache/files/ 下某个 ZIP 文件损坏。但 composer clear-cache 会清空整个 files/,导致后续 install 又得全量重下——其实只需精准删除那个坏 ZIP。
- 从
composer install -v输出末尾找Extracting vendor/xxx/yyy,提取包名(如symfony/console) - 进
$(composer config --global cache-dir)/files/,用包名模糊搜索:ls -l *symfony*console*.zip(Linux/macOS)或 PowerShell 中Get-ChildItem "$env:APPDATA\Composer\Cache\Files" -Filter "*console*.zip" - 只删匹配的 ZIP,别碰
repo/或vcs/ - 删 ZIP 后还报错?说明
composer.lock里硬编码的dist.sha256和新下载内容不匹配——必须同步删vendor/和composer.lock,再跑composer install --no-cache --force-checksums
镜像源失效会让所有清理都白做
如果你还在用已下线的镜像(如 packagist.phpcomposer.com),即使清完三处缓存,composer update 也会卡在 DNS 或 404,甚至静默失败后残留半成品 vendor/。当前唯一稳定可用的中文镜像是:
-
https://mirrors.aliyun.com/composer/(阿里云,推荐) -
https://mirrors.tencent.com/composer/(腾讯云,偶有延迟)
执行前务必确认:composer config -g repo.packagist 输出是否为上述地址。如果项目级 composer.json 里有 repositories 字段,它会覆盖全局设置——检查它是否还硬编码着旧镜像 URL。CI 环境中尤其要警惕:composer.lock 里若记录了失效源地址,重装永远走错路。











