根本原因是composer默认超时阈值过低且无代理重试机制,导致国内源或私有仓库响应慢时频繁超时;应优先调高process-timeout、禁用并行下载、换用国内镜像源,并针对性优化 autoload 生成与 ci 环境配置。

Composer install/update 时卡在 Downloading... 或报 Connection timed out
根本原因不是网络“不通”,而是 Composer 默认的超时阈值太低(尤其是国内源或私有包仓库响应慢时),加上默认并发下载 + 无代理重试机制,很容易触发 curl: (28) Operation timed out 或 file_get_contents(): failed to open stream: Connection timed out。
实操建议:
- 先临时提高全局超时:运行
composer config -g process-timeout 300(单位秒,300=5分钟);若仍失败,可试600 - 禁用并行下载能显著降低连接压力:
composer config -g use-include-path false并配合COMPOSER_PROCESS_TIMEOUT=0环境变量(部分版本更认这个) - 避免在 CI/CD 中依赖默认超时——必须显式设置
COMPOSER_PROCESS_TIMEOUT和COMPOSER_HOME,否则容器重启后配置丢失
国内用户绕过 Packagist 官方源直连(换源 + 镜像兼容性)
直接改 packagist.org 为阿里、腾讯或华为镜像,不等于“一劳永逸”。很多项目硬编码了 repositories 或用了私有 VCS 包,镜像只加速公共包,对 git@ 或 https://github.com/xxx 类源无效。
实操建议:
- 全局换源(推荐阿里):
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 但注意:Laravel Mix、某些 Symfony bundle 会读取
composer.json里的repositories字段,优先级高于全局配置,得同步检查并清理冗余项 - 如果项目含私有 GitLab/GitHub 私仓,别把它们也加进镜像配置里——镜像不代理 VCS,反而会导致
Failed to clone https://xxx: could not connect to server
composer install 卡在 Generating autoload files 后无响应
这不是网络问题,是 autoloader 生成阶段在递归扫描大量文件(尤其 vendor/ 下有 symlink 或嵌套过深的包),PHP 进程被系统限制或 I/O 阻塞。常见于 WSL2、Docker for Mac 或 NTFS 挂载卷。
实操建议:
- 跳过 autoload 生成(仅调试用):
composer install --no-autoloader,之后手动跑composer dump-autoload --optimize - 检查是否启用了
apcu扩展但未配置apc.enable_cli=1,会导致 CLI 模式下 autoload 构建异常缓慢 - WSL2 用户务必确认
/mnt/c/下路径已加入etc/wsl.conf的metadata = true,否则 symlink 解析极慢
CI 环境中 composer install 随机超时(GitHub Actions / GitLab CI)
CI 默认环境 DNS 不稳定、无缓存、且常受限于 runner 的 CPU/内存配额。单纯调高 process-timeout 只是掩盖问题,真正瓶颈常在 DNS 解析或 TLS 握手。
实操建议:
- 强制使用 IPv4(规避 IPv6 超时):
export COMPOSER_IPV4=1 - 关闭 HTTPS 验证(仅限可信内网 CI):
composer config -g secure-http false,避免证书链校验耗时 - 预热 Composer 缓存层:在 job 开头加
composer clear-cache,再用composer install --no-interaction --prefer-dist --optimize-autoloader,避免 fallback 到 source
超时问题最麻烦的地方在于它不报错,只沉默卡住。一旦出现在 CI 流水线里,往往要结合 strace -e trace=connect,sendto,recvfrom 抓底层 syscall 才能定位是 DNS、TLS 还是服务端响应慢——别只盯着 process-timeout 调数字。










