Composer镜像不处理分片传输,仅同步完整元数据和dist包;校验依赖HTTP状态码、Content-Length与SHA256、last_sync_time时间戳,所有分片逻辑由客户端或Packagist上游完成。

Composer镜像同步系统本身不参与大文件分片传输,也不做分片级校验或重试——它只同步元数据(JSON)和预构建的 dist 包(ZIP/TAR),所有“分片”逻辑都发生在客户端(如 PHP 应用上传大包)或上游源(Packagist)内部。
为什么 Composer 镜像不会收到“分片”请求
镜像站是只读缓存,所有请求都是对完整资源的 GET:比如 https://mirrors.aliyun.com/composer/p2/laravel/framework/10.0.0.json 或 https://mirrors.aliyun.com/composer/dist/laravel/framework/10.0.0.0-laravel-framework-zip。它从不接收 POST /upload/chunk 这类接口,也没有 chunk_index、total_chunks 这些字段的解析逻辑。
所谓“分片传输”,只存在于两类场景中:
- 你用自定义 PHP 服务实现大包上传(如前端分片 + 后端
fopen($chunkPath, 'r')拼接),此时校验与重试必须由你代码控制 - Packagist 自身在接收 vendor 提交的 dist 包时可能做了分片(但对外不可见,且镜像不参与该过程)
镜像同步实际校验的是什么
镜像站验证的是整个文件的完整性,不是分片:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- HTTP 状态码:收到 404 表示未同步;500/502 表示上游拉取失败
- Content-Length + SHA256 校验:下载完
p2/xxx.json后,比对与 Packagist 官方同路径文件的sha256sum,不一致即丢弃重拉 - last_sync_time 时间戳:若
curl -s https://mirrors.aliyun.com/composer/last_sync_time返回值比当前时间早 2 小时以上,说明整体同步滞后
注意:packages.json 文件本身包含所有 provider 的哈希摘要,镜像可据此跳过已校验过的子文件,但依然不涉及“分片哈希数组”。
如果你真在做分片上传,校验和重试得自己写死
一旦你用 Guzzle 发起带 multipart 的分片上传(如示例中的 chunk_index 和 file_id),那重试逻辑就完全脱离 Composer 控制:
- 不能依赖
retries参数:它只作用于 Composer 自身的 dist 下载,对你的$client->request('POST', ...)无效 - 跳过已存在分片:服务端返回
{"exists": true}时,必须在客户端判断并跳过fopen()和重试,否则会重复上传或报错 - 校验必须端到端:上传完所有分片后,要调用合并接口,并校验最终 ZIP 的 CRC32 或 SHA256,不能只信 HTTP 200
- 临时文件清理:
fopen($chunkPath, 'r')前要确保路径可读;失败时需手动unlink($chunkPath),否则残留文件会污染下次上传
最容易被忽略的一点
镜像 URL 末尾的 / 是硬性要求,而分片上传接口的路径拼接却常被忽略斜杠——比如把 https://mirror.example.com 直接拼成 https://mirror.example.comupload/chunk。这种低级错误不会报错,但会导致 404,且日志里看不出是拼接问题还是同步问题。

















