答案是composer默认复用15分钟内未过期的本地packages.json缓存,导致即使镜像站已更新新版本,update仍按旧索引计算;解决需执行composer update --refresh(≥2.5)或手动删除对应repo缓存子目录,并确认镜像配置正确且未被项目级repositories覆盖。

改了镜像 URL 却还是拉不到新包,不是镜像没同步,而是 Composer 本地缓存的 packages.json 还在用旧索引——它默认 15 分钟内绝不重拉,哪怕阿里云镜像上已上线 monolog/monolog v3.6.0,你本地仍按 v3.5.0 解析依赖。
确认当前生效的镜像源是否写对
Composer 不会报错,但键名、类型、URL 格式任一出错,就静默 fallback 到官方源。常见错误包括:
-
repo.packagist写成repos.packagist(多一个 s)或packagist.org(少一个 o),Composer 完全忽略该配置 - 漏掉中间的
composer类型声明,命令变成composer config -g repo.packagist https://mirrors.aliyun.com/composer/,2.x 版本直接当无效值处理 - URL 缺末尾斜杠,比如写成
https://mirrors.aliyun.com/composer,实际请求路径变成/composerpackages.json,返回 404
验证方式:运行 composer config -g repo.packagist,输出必须是完整 JSON,形如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。空、字符串、报错,都说明没生效。
强制刷新元数据缓存(关键步骤)
镜像源本身不决定“能不能拿到最新版”,真正卡住的是本地复用的 packages.json。它缓存在 ~/.composer/cache/repo/ 下对应镜像目录里,composer clear-cache 对它完全无效——那个命令只清 ZIP 包和部分 provider 缓存。
- Composer ≥ 2.5:直接执行
composer update --refresh,只删packages.json和provider-*.json,不碰已下载 ZIP、不重建composer.lock - Composer ≤ 2.4:手动清理,先查缓存路径:
composer config --global cache-dir,再进repo/子目录找匹配镜像 URL 的文件夹(如https---mirrors-aliyun-com-composer),最后执行rm -rf $(composer config --global cache-dir)/repo/https---mirrors-aliyun-com-composer
执行后立刻跑 composer update vendor/package-name,新版本才能被识别出来。
检查项目级 repositories 是否覆盖全局配置
只要项目根目录的 composer.json 里有 repositories 字段,全局镜像设置就自动失效——这是 Composer 的设计逻辑,不是 bug。
- 检查是否存在:运行
composer config repo.packagist(无-g),有输出说明项目级配置正在起作用 - 临时禁用:执行
composer config --unset repositories,它只删当前项目的repositories字段 - 若项目必须保留私有源,需显式把镜像源也写进
repositories数组里,不能只靠全局配置
验证镜像站是否真同步了你要的包
别信网页界面或 composer diag——它默认只测 packagist.org,完全不检查你配的镜像。
- 确认当前生效镜像:
composer config -g repos.packagist.url(注意是复数repos,单数repo在 Composer 2.2+ 已失效) - 查全量索引是否更新:
curl -I https://mirrors.aliyun.com/composer/packages.json,必须返回HTTP/2 200且Last-Modified时间合理 - 查具体包是否存在:
curl -s https://mirrors.aliyun.com/composer/p2/vendor/package-name.json | jq -r '.packages."vendor/package-name" | keys[]' | sort | tail -3 - 对比官方源输出:
curl -s https://packagist.org/p2/vendor/package-name.json | jq -r '.packages."vendor/package-name" | keys[]' | sort | tail -3,版本不一致即为同步延迟
同步延迟常发生在小众包或刚发布的版本上,阿里云镜像通常每 15 分钟同步一次,但个别包可能滞后数小时——此时换腾讯云或华为云镜像有时能绕过这个窗口期。











