Composer安装包下载中断 断点续传失败解决思路【解决】

13次阅读

composer 不支持断点续传,因其下载的 ZIP 包需完整 SHA256 校验,且 gitHub 等源不支持 Accept-Ranges、URL 内容不固定;中断后会清空临时文件重试,但可通过镜像源、缓存目录或手动预置 ZIP 加速。

Composer安装包下载中断 断点续传失败解决思路【解决】

Composer 安装包下载中断后默认不支持断点续传,composer installcomposer update 会直接清空已下载的临时文件并重试,这不是 bug,而是设计如此——因为 Composer 的下载逻辑基于完整 ZIP 包校验(SHA256),中间文件不可复用。

为什么 Composer 不做断点续传

Composer 下载的是由 Packagist 签名分发的 ZIP 归档(如 https://api.github.com/repos/monolog/monolog/zipball/...),其响应头不含 Accept-Ranges,且服务端不保证同一 URL 多次请求返回相同内容(例如 GitHub 的 zipball URL 带临时 Token)。更关键的是,Composer 在下载完成后必须校验整个 ZIP 的 sha256 值,任何局部文件都无法跳过校验流程。

临时目录被清空导致重下全部

当下载中断时,Composer 会在 vendor/composer/tmp-xxxxx.zip 写入不完整 ZIP,但下次运行时会检测到该文件校验失败,自动删除它并新建临时文件。你看到“又从 0% 开始”,其实是这个清理行为造成的假象。

  • 可通过设置 COMPOSER_CACHE_DIR 指向一个可读写的稳定路径,避免因权限或磁盘满导致意外中断
  • 检查 ~/.composer/cache/files/(或 COMPOSER_CACHE_DIR/files/)是否有已缓存的完整 ZIP:如果某个包此前成功安装过,Composer 会直接解压缓存,不重新下载
  • 不要手动修改 vendor/composer/ 下的 tmp 文件——它会被立即覆盖

真正可行的加速方案

绕过网络下载瓶颈,改用本地缓存或镜像源

  • 国内用户优先配置阿里云镜像:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
  • 启用 composer install --prefer-dist(默认行为),确保走 ZIP 分发而非 Git 克隆
  • 若已有完整 ZIP 包(比如从同事处拷贝),可放入缓存目录:~/.composer/cache/files/vender/package-name/xxx-sha256.zip,Composer 会自动识别并跳过下载
  • 极端慢速网络下,可先用 wget -ccurl -C - 手动下载 ZIP 到缓存目录,再运行 composer install

最常被忽略的一点:Composer 的“下载失败”提示往往不是网络问题,而是 dns 解析超时或 TLS 握手失败(尤其在企业代理后),此时换镜像源比调什么断点参数有用得多。

text=ZqhQzanResources