Composer 2.2+ 必须启用 http.keepalive true,否则内网穿透环境下因复用已断socket导致Connection reset by peer;键名严格为http.keepalive,旧版本不支持该配置。

Composer 2.2+ 的 http.keepalive 必须开,否则穿透链路必断
内网穿透(frp/ngrok)环境下,Connection reset by peer 错误几乎都源于 Composer 复用已断的 socket——穿透服务端空闲超时关闭 TCP 连接,而 Composer 默认不发 HTTP keep-alive 头,下一次请求就撞上“死连接”。http.keepalive true 是唯一能阻止该行为的配置,且仅在 Composer 2.2+ 生效。
不生效的常见原因:
-
composer config -g http.keepalive true写错成http.keep-alive或keepalive(键名严格区分) - 用了旧版 Composer(composer self-update
- 服务端 frp 没配心跳:仅客户端开 keep-alive 不够,
server.toml中必须有heartbeat_interval = 30和heartbeat_timeout = 90
http.connect-timeout 要设小,不是越大越好
弱网下建连阶段(TCP handshake + TLS 握手)最容易卡住,尤其穿透链路中间节点响应慢。http.connect-timeout 30 是合理上限——设太高只会让失败请求拖更久,掩盖真实链路问题。
注意它和 http.timeout 的分工:
-
http.connect-timeout:只管“连上服务器”这一件事,单位秒,超时即重试 -
http.timeout:管整个 HTTP 请求周期(含读响应体),默认 300 秒,弱网建议设为600 - 二者都需全局配置:
composer config -g http.connect-timeout 30、composer config -g http.timeout 600
parallel-downloads=10 是并发安全线,别盲目调高
弱网下开高并发反而容易触发连接竞争或临时文件冲突,parallel-downloads 设为 10 是实测平衡点。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
超过 10 的风险:
- 本地 cURL multi 句柄耗尽,报
file_put_contents(/tmp/): failed to open stream - 企业防火墙或代理对并发敏感,批量请求被限速或丢包
- 镜像源本身对单 IP 并发有限制,高频请求可能触发 429
若仍不稳定,优先降为 6 或 8,而非加 timeout。
PHP 底层 default_socket_timeout 会劫持 Composer 配置
就算你把 http.timeout 设到 1200,只要 PHP CLI 的 default_socket_timeout 还是默认 60 秒,cURL 或 stream 就会在 60 秒强制断开——这个值不走 Composer 配置,得单独干预。
验证与绕过方式:
- 查当前值:
php -i | grep default_socket_timeout - 临时生效(推荐 CI/调试):
php -d default_socket_timeout=1200 $(which composer) install - 不建议改 php.ini,会影响其他 CLI 脚本
真正稳定的组合是:Composer 层 http.keepalive + http.connect-timeout + http.timeout 全开,再用 PHP 参数兜底。漏掉任意一层,长连接保活就不可靠。

















