Composer下载卡在Downloading时,实际生效的是http-timeout参数;该参数控制HTTP请求超时,process-timeout对此阶段完全无效,常见错误如cURL error 28、Operation timed out均属此范畴。

Composer下载卡在Downloading时,实际生效的是哪个超时参数?
卡在 Downloading https://... 阶段失败,http-timeout 是唯一真正起作用的配置项,process-timeout 完全不参与这一环节。
常见错误现象包括:cURL error 28、Operation timed out、反复重试后静默退出。这些都属于 HTTP 层响应等待超限,不是整个命令跑太久的问题。
-
http-timeout默认值通常为 300 秒,建议设为600(10 分钟):运行composer config -g http-timeout 600 - 若全局配置被忽略(如共享主机),改用环境变量:
COMPOSER_HTTP_TIMEOUT=600 composer install - PHP 自身的
default_socket_timeout也会干扰,临时绕过:运行php -d default_socket_timeout=600 $(which composer) install - 注意镜像 URL 末尾不能带斜杠,否则配置可能失效;验证方式:
curl -I https://mirrors.aliyun.com/composer/packages.json应秒回200 OK
为什么调高 timeout 还是失败?重点排查 TLS 和 DNS
cURL error 28 表面是超时,但根源常在 DNS 解析或 TLS 握手卡住,而非网速慢。这时候加 timeout 只是延长等待,无法解决问题。
实操建议:
- 先确认 DNS 是否污染:运行
dig packagist.org或nslookup packagist.org,看是否返回镜像站 IP(如阿里云对应mirrors.aliyun.com) - 手动测试链路:
curl -v https://mirrors.aliyun.com/composer/packages.json,观察卡在Resolving host、TCP connect还是TLS handshake - 企业内网常见中间人代理未导入根证书,此时
-vvv日志末尾会显示error:14090086而非28,需联系运维补证书 - 强制走 IPv4 可绕过 IPv6 支持不全问题:
COMPOSER_IPV4=1 composer install
Composer 的 HTTP 层重试逻辑到底怎么工作?
Composer 没有 --retry 命令行开关,它的重试行为是隐式、有限且分层的——只对特定错误码自动触发,且不控制 DNS 或 TLS 层。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
关键事实:
- 默认最多重试 3 次,仅针对可恢复错误:
CURL error 6(DNS 失败)、28(连接超时)、5xx、401/403(需配认证) - 延迟策略是渐进式:第 2 次重试休眠 100ms,第 3 次及以后休眠 500ms,代码位于
src/Composer/Util/Http/CurlDownloader.php - 重试由 cURL 自身驱动,Composer 不干预;所以
CURLOPT_CONNECTTIMEOUT(默认 10 秒)和CURLOPT_TIMEOUT才是底层边界 - 想调整重试次数?只能通过配置项:
composer install --retries=5或在composer.json的"config"里加"retries": 5
CI/CD 中最容易失效的超时配置有哪些?
容器每次重启都会丢掉全局配置,COMPOSER_HOME 不固化 = 白配;而且 CI 环境默认启用 IPv6,而多数国内镜像站对其支持不完整,导致隐性叠加延迟。
必须显式设置:
-
export COMPOSER_HOME=/tmp/composer(避免每次重建丢失配置) -
COMPOSER_PROCESS_TIMEOUT=1200(process-timeout全局配置在新版 Composer 中已失效,只认这个环境变量) -
COMPOSER_IPV4=1(Linux/macOS)或系统级设置该变量为字符串"1"(Windows) - 禁用 fallback 到官方源:
composer config -g packagist false,避免因下线私源逐个超时重试 - 别在 CI 上跑
composer update—— 它会重新解析依赖树,耗时远高于install,应基于已提交的composer.lock
最易被忽略的点:autoload 阶段卡住根本不是网络问题,而是 I/O 阻塞(WSL2、Docker for Mac、NTFS 卷),调 timeout 没用。要查 Generating autoload files 后是否还有输出,再决定是否跳过生成。

















