composer 不依赖 http 304 实现包文件缓存,其缓存是基于本地磁盘的强缓存机制:通过 dist.url 的 url-safe 哈希生成缓存路径,结合 dist.shasum 校验命中后直接解压复用,完全跳过网络请求。

Composer 没有 HTTP 缓存意义上的「304 复用」机制,也不依赖 304 Not Modified 状态码做包下载缓存。它压根不走浏览器那一套协商缓存流程。
Composer 的缓存是本地磁盘缓存,不是 HTTP 协商缓存
Composer 客户端在下载包(如 vendor/composer/ 下的 zip 或 tar.gz)时,会把已下载的归档文件存到本地缓存目录(默认为 ~/.composer/cache/)。下次安装相同版本时,直接解压复用,完全跳过网络请求 —— 这属于「强缓存」行为,不发任何 HTTP 请求,自然也不存在 304。
常见误解:看到 Composer 请求 GitHub API 或 packagist.org 时返回 304,就以为它在用这个状态码控制包内容缓存。其实不是:
-
304只可能出现在 Composer 查询元数据(如packages.json、composer.lock对应的 repo manifest)时,用于判断远程仓库索引是否变更 - 这类请求带
If-None-Match或If-Modified-Since,服务端用ETag或Last-Modified做校验 - 但
304仅影响「是否更新本地元数据缓存」,不影响实际包文件(zip/tar)的下载逻辑
Composer 如何判断包归档文件是否命中本地缓存
它靠的是确定性哈希和路径映射,不是 HTTP 响应头。关键点:
- 每个包版本对应唯一
dist.url和dist.shasum(SHA256) - Composer 将
dist.url做 URL-safe hash,生成本地缓存路径,例如:~/.composer/cache/files/vendorgroup/packagename/abc123.zip - 安装前检查该路径是否存在 +
shasum校验通过 → 直接解压,不下载 - 哪怕服务器上同一 URL 返回了新内容(且未改
shasum),Composer 仍会拒绝使用 —— 因为校验失败
所以你改了包内容但没改 shasum,Composer 不会发现;反之,shasum 变了哪怕一个字节,它就强制重下。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
为什么你在 Network 面板里看到 304?那只是元数据请求
当你运行 composer update,Composer 会批量请求 Packagist 或私有仓库的 packages.json 清单。这些请求:
- 带
If-None-Match: "xxx"(来自上次响应的ETag) - 服务端比对后返回
304→ Composer 跳过更新本地packages.json缓存 - 如果返回
200,才解析新清单、重新计算依赖图 - 整个过程与
vendor/里的具体包文件无关
换句话说:304 在这里只省了一次 JSON 下载,不省任何一个 zip 包的下载或解压。
想真正复用包文件?别指望 304,得靠 cache-dir 和 lock 文件
真正影响包文件是否复用的,是以下三件事:
-
composer install(而非update):严格按composer.lock中记录的dist.shasum和dist.url查本地缓存 -
cache-dir配置未被清空:删了~/.composer/cache/就等于废掉所有归档缓存 - 没手动加
--no-cache或设置COMPOSER_CACHE_DIR=/dev/null
HTTP 层的 304 对包体积大的项目几乎无感;而磁盘缓存失效,才是导致 CI 构建突然变慢的真凶。










