composer_no_ipv6=1是首选解法,因它在composer 2.2+中原生支持,于dns解析阶段直接过滤ipv6地址,不依赖curl版本、不改系统配置、不影响其他进程,比curl_ipresolve=4更底层稳定。

直接设 COMPOSER_NO_IPV6=1 环境变量,是当前最可靠、兼容性最好、副作用最小的解法。
为什么 COMPOSER_NO_IPV6=1 是首选
Composer 2.2+ 原生支持该变量,它在域名解析阶段就过滤掉所有 IPv6 地址(如 2a02:fc00::1),不依赖 cURL 版本、不改动系统配置、也不影响其他 PHP 进程。相比 CURL_IPRESOLVE=4,它更底层、更稳定——后者要求 libcurl ≥ 7.19.4 且 PHP 编译时启用 IPv6 支持,否则静默失效。
常见错误现象:执行 composer install 卡在 Resolving dependencies 或反复重试 IPv6 地址(日志里出现 [2a02:fc00::1]:443);composer diagnose 报 curl error 7 或连接超时。
- Linux/macOS:
COMPOSER_NO_IPV6=1 composer install - Windows PowerShell:
$env:COMPOSER_NO_IPV6="1"; composer install - Windows CMD:
set COMPOSER_NO_IPV6=1 && composer install
use-ipv4 true 配置项适用场景与限制
该配置写入 composer.json 或全局 config 后,会让后续所有命令默认走 IPv4 解析,但仅对 Composer 2.2+ 生效;Composer 1.x 完全忽略它,仍需靠环境变量。
使用场景:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 当前项目长期用 IPv4:运行
composer config use-ipv4 true,写入composer.json的config字段 - 全局生效(慎用):运行
composer config -g use-ipv4 true,写入~/.composer/config.json
注意:composer.lock 中已记录的源 URL 不会自动更新,但下次 update 或 require 时会按新规则解析。
换阿里云镜像 + 强制 IPv4 解析才是稳态组合
单靠禁用 IPv6 只解决“fallback 慢”,换镜像则从源头避开国际链路不稳定。阿里云镜像本身响应 IPv4 请求更优,再叠加 COMPOSER_NO_IPV6=1,能彻底规避 DNS 解析和连接阶段的隐性等待。
实操步骤:
- 全局换源:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/(末尾斜杠不能少) - 验证是否生效:
composer diagnose查看Repo packagist.org:后是否为阿里云地址;或curl -I https://mirrors.aliyun.com/composer/packages.json应秒回 200 - 若仍解析出 IPv6 地址,可临时加 hosts 映射:
118.31.67.205 mirrors.aliyun.com(路径:Linux/macOS 为/etc/hosts,Windows 为C:\Windows\System32\drivers\etc\hosts)
别碰系统级 IPv6 关闭或 hosts 硬编码
关系统 IPv6(如 sysctl -w net.ipv6.conf.all.disable_ipv6=1)会影响 Docker、Kubernetes 和部分 PHP 扩展;手动把 packagist.org 指向固定 IPv4 地址风险更高——CDN 节点轮换频繁,硬编码很快失效,且可能触发 TLS 证书错误(cURL error 60)。
真正起效的是让 Composer 自己跳过 IPv6 解析,而不是教它怎么选路。复杂点在于:CI/CD 环境中,COMPOSER_HOME 不固化会导致配置丢失,必须在脚本开头显式设置并配合环境变量,否则看似配了,实际没生效。










