composer install 在低带宽下卡在“downloading”阶段,因默认下载含测试/文档/.git的完整zip包,且不支持并行解压,弱网下易超时或重试;github cdn限流加剧问题。

为什么 composer install 在低带宽下卡在 “Downloading” 阶段?
因为默认行为会下载完整 ZIP 包(含测试、文档、.git 目录等),且不启用并行压缩流解包,单连接慢速下载时容易超时或反复重试。PHP 的 curl 或 ext-zip 在弱网下对大文件响应迟钝,尤其遇到 GitHub 的 CDN 节流时更明显。
- 默认走
https://api.github.com/repos/...获取 ZIP,不是稀疏 clone -
composer.lock里记录的是完整 dist URL,没做带宽适配 - 即使加了
--prefer-dist,也拦不住 ZIP 包本身体积大
用 composer install --no-plugins --no-scripts 真的能提速吗?
能,但只对“安装后执行”阶段有效;真正卡住的下载环节不受影响。不过关闭插件可避免某些插件(如 hirak/prestissimo 旧版)在低带宽下因并发连接数过高反而触发限流。
-
--no-plugins:禁用所有插件,包括可能偷偷开多连接的下载加速器 -
--no-scripts:跳过post-install-cmd等脚本,防止它们再拉额外资源 - 真正起效的是配合
--prefer-dist+ 自定义镜像源,而非这两个 flag 本身
如何让 Composer 只下载最简依赖(无 test/doc/.github)?
靠 composer config --global archive-format zip 不够,得从源头控制 dist 包内容。GitHub 上的 dist ZIP 默认包含所有文件,必须换用支持「sparse archive」的镜像源或改用 source 模式 + git clone --depth=1。
- 国内阿里云、腾讯云 Composer 镜像已默认启用 sparse ZIP(剔除
tests/、docs/、.github/) - 配置镜像:
composer config --global repos.packagist.org '{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}' - 若仍需更小体积,强制切 source:
composer install --prefer-source --no-progress,此时走 git clone,但要求目标仓库允许匿名 git 协议访问
composer update 在低带宽下失败的常见错误信息和对策
典型报错是 file_put_contents(...): failed to open stream: No space left on device(磁盘满)或 cURL error 28: Operation timed out —— 实际常因临时解压目录写满,或 DNS+TLS 握手耗时叠加下载超时。
- 增大超时:
composer config --global process-timeout 3600(单位秒) - 清理缓存避免重复下载:
composer clear-cache,再删掉~/.composer/cache/files/下残留的半截 ZIP - 限制并发:
composer config --global github-protocols ["https"],禁用 git:// 协议(某些网络下不稳定) - 别用
composer update,改用composer install(依赖composer.lock精确版本,跳过依赖解析)
composer install --prefer-dist --no-progress --no-scripts + 提前确认磁盘空间和超时设置。很多人忽略的是 --no-progress —— 它不只是隐藏进度条,还能减少频繁的终端刷新 IO,在 SSH 延迟高时反而提升整体完成率。










