因为 composer 镜像站对 packages.json 等元数据强制启用 gzip 压缩传输(20+ mb 原文件压至 2–3 mb),且 nginx/cdn 缓存压缩后版本;curl 若未带 accept-encoding: gzip 会误获未压缩体,而 composer update --refresh 仅下载压缩后的 json 索引,跳过 zip 包传输与本地校验。

为什么 packages.json 越来越大,但镜像传输没变慢?
因为 Composer 镜像站不传原始 JSON,而是用 gzip 压缩后传输——packages.json 本身已从早期的几 MB 膨胀到 20+ MB(2026 年中),但实际 HTTP 响应体通常压到 2–3 MB。服务端强制开启 Content-Encoding: gzip,且 Nginx 或 CDN 层会缓存压缩后版本。你 curl 时若没带 -H "Accept-Encoding: gzip",可能拿到未压缩体,误判为“镜像卡顿”。
composer update --refresh 不重传 ZIP,只拉压缩元数据
执行该命令时,Composer 仅重新 GET 以下两类文件,且都走 gzip 压缩通道:
-
https://mirrors.aliyun.com/composer/packages.json(主索引,约 2.5 MB 压缩后) -
https://mirrors.aliyun.com/composer/p2/vendor/package/version.json(provider 分片,单个几十 KB,同样压缩)
它完全跳过 dist ZIP 包下载,也不校验本地已缓存包的 dist.shasum —— 所以耗时集中在 DNS 解析 + TLS 握手 + 下载那几个 JSON,而非磁盘 IO 或解压开销。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
别手动解压 packages.json,Composer 不需要你干预
Composer 内部用 PHP 的 gzdecode() 自动处理响应体,你看到的 vendor/composer/installed.json 是解析后的内存结构,和传输压缩无关。常见错误包括:
- 用
curl -s https://.../packages.json | gunzip手动解压后保存,再试图替换缓存——这会导致校验失败,因为 Composer 依赖响应头里的Last-Modified和 ETag 做缓存判断 - 在 CI 中禁用 gzip(如加
--compressed=false),结果请求体积暴增,超时概率上升 - 误以为“压缩率低=镜像差”,其实阿里云/中科大镜像的 gzip 压缩比稳定在 85–90%,差异主要来自元数据字段冗余(如大量
support和funding字段)
真正影响元数据传输速度的,是路径拼接错误而非压缩
最常被忽略的瓶颈不是压缩本身,而是 URL 拼错导致的静默 fallback:
- 配成
https://mirrors.aliyun.com/composer(缺末尾/)→ 请求变成https://mirrors.aliyun.com/composerpackages.json→ 404 → Composer 自动切回https://repo.packagist.org/packages.json(无压缩、无 CDN、跨洋延迟) - 项目级
repositories里写错type或漏/,同样触发 fallback,但-vvv日志里只显示 “Loading repository…” 后直接卡住,不提示失败源
验证是否真走镜像:运行 composer update --no-cache -v,看终端输出的第一行 GET 请求地址是不是你配的镜像域名 + /packages.json。










