主流中文镜像元数据同步延迟:阿里云每10分钟、腾讯云每5分钟、中科大每30分钟全量同步,但受cdn节点缓存、本地packages.json默认15分钟不过期及composer.lock校验值残留影响,实际感知延迟可达5–30分钟。

镜像同步延迟到底有多久
主流中文镜像的元数据同步不是实时的,而是按固定周期轮询 packagist.org —— 阿里云每 10 分钟、腾讯云每 5 分钟、中科大每 30 分钟全量拉取一次。实际感知到的延迟往往比这个更长:新包发布后,你本地 composer update 查不到,大概率是因为 packages.json 缓存还没更新,而不是镜像“没同步”。
关键点在于:packages.json 默认 15 分钟内不过期,Composer 会直接读缓存,根本不发 HTTP 请求;哪怕镜像站已同步,你本地仍卡在旧版本列表里。
- 阿里云镜像:多数新包 5–10 分钟内入库,但边缘节点可能滞后至 30 分钟
- 腾讯云镜像:标称 5 分钟同步,实测教育网/移动网络下常出现 15–25 分钟偏差
- 中科大镜像:北方及教育网延迟低,但公网访问时偶有同步中断(日志显示 last sync: 2h ago)
为什么 curl 看到 200 却还是拉不到新包
curl -I https://mirrors.aliyun.com/composer/packages.json 返回 HTTP/2 200 只说明镜像服务可用,不代表元数据最新。真正要看的是响应头里的 Age 值:如果 Age: 1800(即 30 分钟),说明你命中的 CDN 节点缓存了半小时前的数据,而其他节点可能已是最新。
同一镜像 URL 在不同网络下返回不一致,本质是 CDN 调度把你分到了不同步的边缘节点。北京联通用户和广东移动用户访问 https://mirrors.aliyun.com/composer/,很可能拿到两个版本的 packages.json。
- 验证方式:用
curl -s https://mirrors.aliyun.com/composer/p2/monolog/monolog.json | jq -r '.packages."monolog/monolog" | keys[]' | sort | tail -3对比官方源输出 - 别信网页界面——镜像首页的“最后同步时间”是主节点时间,不反映你实际命中的边缘节点状态
- 运营商 DNS 解析可能长期绑定某个异常 IP,
dig mirrors.aliyun.com +short查真实 IP 列表再逐个测
如何强制让 Composer 读新数据
composer update --refresh 是唯一可靠的强制刷新手段,但它只在 Composer ≥ 2.5 中有效:它会删掉 ~/.composer/cache/repo/https---mirrors-aliyun-com-composer/packages.json 和所有 provider-*.json,然后从当前配置的镜像源重新下载元数据。
老版本 Composer(≤ 2.4)不支持该参数,只能手动清理:rm -rf $(composer config --global cache-dir)/repo/https---mirrors-aliyun-com-composer。注意:composer clear-cache 没用——它不清 packages.json,只清 dist 包和部分临时 JSON。
- 执行前必须确认镜像地址正确:
composer config -g repos.packagist.url输出应为完整 URL,如https://mirrors.aliyun.com/composer/ - 项目级
"repositories"配置会完全屏蔽全局镜像,此时要查composer config repo.packagist(不加-g) - URL 必须带末尾斜杠,且 type 参数不能省:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
同步延迟最易被忽略的触发点
你以为切了镜像就万事大吉,其实很多失败根本不是同步慢导致的——而是你本地的 composer.lock 还存着旧包的校验值,镜像已同步新版 dist 包,哈希对不上,直接报 checksum verification failed。
这时候删 vendor/ 或跑 --refresh 都没用,因为 composer.lock 里的旧哈希还在。唯一解法是同时删掉 vendor 和 composer.lock,让 Composer 从头生成信任链。
- Linux/macOS:
rm -rf vendor composer.lock - Windows:
rd /s /q vendor & del composer.lock - 操作前务必备份:
cp composer.lock composer.lock.bak - 别用
composer update替代——它默认复用 lock 文件,不会刷新校验值











