composer不支持断点续传,所谓“续传”实为缓存复用与vendor目录状态比对;中断后无法继续下载zip,因其底层curl或php stream不发range请求、不记录进度,临时文件被自动删除,且github临时token链接不可复用,必须校验完整zip的sha256。

Composer 本身不支持断点续传,中文环境下下载失败也和“是否支持断点”无关——它根本没这个机制,所有所谓“续传”都是缓存复用 + 状态比对的副作用。
composer install 中断后为什么不能接着下 ZIP?
因为 Composer 下载 ZIP 包时,底层用的是 curl 或 PHP stream,既不发 Range 请求,也不记录已下载字节数。一旦中断,临时文件(如 vendor/composer/tmp-xxxxx.zip)会被自动删除,下次运行就从头开始下载。
- GitHub 的
zipballURL 带临时 token,同一链接多次请求返回内容可能不同,无法做局部校验 - Composer 必须校验整个 ZIP 的
sha256值,半截文件无法跳过校验流程 - 中文环境常见 DNS 污染、TLS 握手失败、CDN 节点异常(比如阿里云华东镜像返回 502),这些都会触发下载中断,但不是带宽或进度问题
国内用户真正该配的不是“断点参数”,而是镜像源
中文环境下 90% 的“下载失败”本质是连不上 packagist.org 或 GitHub API,换镜像源比任何重试策略都直接有效。
- 全局配置阿里云镜像:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否生效:
composer config -g repo.packagist输出必须是完整 URL,且末尾有/ - 确认连通性:
curl -I https://mirrors.aliyun.com/composer/应返回200 OK,而非超时或502 Bad Gateway - 私有包未同步到镜像?需单独在
composer.json中加repositories块,否则会 fallback 到官方源卡住
缓存目录权限和磁盘空间才是“看似续传实则重下”的元凶
很多人发现明明缓存里有 ZIP,composer install 却仍显示 Downloading … 0%,真实原因是缓存路径不可写或磁盘已满。
- 查缓存位置:
composer config --global cache-dir - 检查该路径是否可写:
ls -ld $(composer config --global cache-dir)(Linux/macOS) - 常见报错:
Failed to create cache directory或file_put_contents(...): failed to open stream: No space left on device - 若权限不对,用
chmod -R u+rw ~/.composer/cache修复;若磁盘满,清理旧缓存或改用COMPOSER_CACHE_DIR指向更大分区
手动预置 ZIP 是唯一接近“断点”的可行操作
如果你已经知道哪个包总失败(比如 laravel/framework),可以绕过网络下载,把 ZIP 直接放进缓存目录让 Composer 复用。
- 从
packagist.org找到对应版本的 dist ZIP 链接(注意是.zip,不是source) - 用
wget -c或curl -C -手动下载(它们才真支持断点续传) - 放入缓存路径:
~/.composer/cache/files/vendor/package-name/sha256-hash.zip(hash 来自composer.lock) - 再跑
composer install --no-scripts --no-plugins,它会跳过下载,直接解压
真正麻烦的从来不是“怎么续”,而是中断后残留的破损 vendor/ 子目录、被截断的 vendor/composer/installed.json、或缓存中损坏的 ZIP —— 这些状态 Composer 不会自动修复,也不会提示你删,但会默默让后续所有命令失败。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











