Composer install/update卡住主因是网络超时配置未生效,需同时设置process-timeout(控制git clone等命令)和http.timeout(控制HTTP下载),并调低PHP的default_socket_timeout以确保底层连接不先超时。

Composer install 或 update 卡住,其实是网络请求超时没生效
默认情况下,Composer 的 HTTP 请求超时是 300 秒(5 分钟),但很多用户遇到「卡在 downloading package」或「hang 在 github.com」,并不是因为超时没触发,而是 Composer 没用上你设的参数——它只认 config 里的 http-basic、github-oauth 等配置项,而超时必须显式设置 process-timeout 和 timeout,且二者作用不同。
-
process-timeout控制的是单个外部命令(比如git clone、unzip)的最大执行时间,默认 300 秒;卡在「Cloning into…」多半是它超了 -
timeout(全名http.timeout)控制的是 HTTP(S) 下载包时的 socket 超时,默认也是 300 秒,但仅对 Composer 自己发起的 HTTP 请求生效(如获取packagist.org的packages.json) - 这两个值都得手动设,否则即使你加了
--timeout=60命令行参数,也只影响当前命令的process-timeout,不改http.timeout
全局设置 timeout 和 process-timeout 的正确方式
推荐用 composer config 写入全局配置,避免每次加参数。注意:全局配置存在 ~/.composer/config.json,项目级配置在 composer.json 的 config 字段下。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 设全局 HTTP 超时(影响所有包下载):
composer config -g http.timeout 60 - 设全局进程超时(影响 git clone/unzip 等):
composer config -g process-timeout 120 - 若只想临时生效,可加命令行参数:
composer install --timeout=90 --http-timeout=30(注意:--http-timeout是 2.2+ 版本才支持,旧版只能靠http.timeout配置) - 验证是否生效:运行
composer config -g --list | grep -E "(timeout|http)",确认输出含http.timeout和process-timeout
为什么设置了 timeout 还卡在 github.com?
这不是 Composer 超时失效,而是 GitHub 的域名解析或连接被拦截导致底层 socket 连接迟迟无法建立——此时 http.timeout 尚未启动计时(它只计「连接建立后」的数据传输阶段)。这种场景下,需要额外干预 DNS 或代理。
- 检查是否走代理:
echo $HTTP_PROXY/echo $HTTPS_PROXY,若已设但不可用,会无限等待 - 强制跳过 DNS 缓存(尤其 macOS):
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder - 临时用 IP 直连 GitHub(仅调试):
查最新 GitHub IP(如api.github.com的 A 记录),然后加 hosts 条目:140.82.121.3 api.github.com - Composer 本身不处理 TCP 连接层超时,所以
http.timeout对「卡在 connect()」无效;真正起作用的是系统级的curl或 PHP 的default_socket_timeout(建议设为 10–15 秒)
PHP ini 中 default_socket_timeout 的影响
Composer 底层用 PHP 的 stream_context_create() 发起 HTTP 请求,而它的默认 socket 超时由 PHP 配置 default_socket_timeout 控制(默认 60 秒)。如果这个值比 http.timeout 还小,就会先触发系统级超时,Composer 来不及响应自己的逻辑。
- 查看当前值:
php -i | grep default_socket_timeout - 临时覆盖(推荐):
php -d default_socket_timeout=30 composer.phar install - 永久修改(需重启 PHP CLI):
编辑php.ini,设default_socket_timeout = 30 - 注意:Web SAPI(如 Apache/Nginx)下的 PHP 不影响 Composer CLI,只改 CLI 的
php.ini
http.timeout 和 default_socket_timeout 应保持一致或后者略小;process-timeout 则要留足余量——比如大包解压可能耗时 20 秒,那就别设成 30 秒。

















