composer元数据缓存不依赖http响应头,而是采用本地文件缓存加固定ttl策略,默认15分钟强制重拉,无视cache-control、etag等头字段,仅通过cache-files-ttl和缓存目录持久性控制行为。

Composer元数据缓存不走HTTP响应头,Cache-Control和ETag基本无效
Composer 本身不依赖 HTTP 缓存头(如 Cache-Control、ETag、Last-Modified)来决定是否跳过元数据拉取。它用的是本地文件缓存 + 固定 TTL 策略:默认对 packages.json 缓存 15 分钟,不管镜像服务器返回什么响应头。
你看到镜像站返回 Cache-Control: public, max-age=300 或 ETag: "abc123",Composer 完全不读——它只看自己缓存目录里那个文件的修改时间戳和配置项 cache-files-ttl。
- 即使镜像源返回
max-age=86400,Composer 仍会在 15 分钟后强制重拉(除非你手动调大cache-files-ttl) - 即使镜像返回了
304 Not Modified,Composer 也不会发条件请求;它要么用本地缓存,要么直接 GET 全量 - 所有主流国内镜像(阿里云、清华、腾讯)都禁用了对 Composer 客户端的响应头干预,因为没用
composer update --refresh 绕过的是本地 TTL,不是 HTTP 缓存
执行 composer update --refresh 时,Composer 并不会加 If-None-Match 或 If-Modified-Since 请求头去试探镜像站。它直接删掉 ~/.composer/cache/repo/ 下对应源的所有 packages.json 和 provider-*.json 文件,然后无条件发起全新 GET 请求。
这个操作的效果是“强制刷新元数据”,但代价是丢掉所有本地元数据缓存,哪怕镜像站实际没更新,也要多花几百毫秒重新下载几个 JSON 文件。
- 仅适用于 Composer ≥ 2.5;老版本只能手动
rm -rf $(composer config --global cache-dir)/repo/https---mirrors-aliyun-com-composer - 它不碰
~/.composer/cache/files/(即 ZIP 包缓存),所以不影响 dist 包复用 - 别和
--no-cache混用:--no-cache是每次请求都跳过本地缓存,--refresh是一次性清空再重拉
为什么 curl -I 看到的镜像响应头和 Composer 行为不一致
用 curl -I https://mirrors.aliyun.com/composer/packagist.org/packages.json 确实能看到 Cache-Control: public, s-maxage=300 这类头,但这只是给 CDN 或浏览器看的,Composer 的 HTTP 客户端(基于 PHP 的 file_get_contents 或 cURL 封装)压根不解析它们。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
真正控制二次拉取速度的,是以下三个本地参数:
-
cache-files-ttl:元数据缓存有效期(单位秒),默认 900(15 分钟),建议设为15552000(6 个月) -
http-max-concurrent-downloads:影响并发请求数,间接决定“拉完一批元数据要多久”,推荐 8–10 - 缓存路径是否可写且跨命令持久:如果
COMPOSER_CACHE_DIR指向临时目录(如 CI 中未显式设置),每次都是新缓存
镜像站改响应头对 Composer 安装速度几乎没影响
国内镜像服务端调整 Cache-Control、启用 ETag、甚至开 Brotli 压缩,都不会让 Composer install 或 update 变快。因为 Composer 不做条件请求,也不校验响应头。
唯一能靠响应头提速的场景,是当你在 CI 中用 curl 或 wget 手动预热元数据(比如提前下好 packages.json 放进缓存目录),但这种做法绕过了 Composer 自身逻辑,容易出错且不被官方支持。
真正该盯住的,永远是这三件事:镜像 URL 是否生效、cache-files-ttl 是否足够长、缓存目录是否真的被复用——HTTP 响应头只是幻觉。










