composer本身不处理双栈优先级,其http请求完全依赖curl或php stream;dns解析、协议栈选择及fallback均由底层网络栈决定,composer仅封装调用,不干预a/aaaa记录排序、连接重试或镜像源切换逻辑。

Composer本身不处理IPv4/IPv6双栈优先级
Composer的HTTP请求完全依赖底层cURL或PHP stream,它自己不解析DNS返回的A/AAAA记录顺序,也不控制连接时的协议栈选择。所谓“双栈下优先请求高可用节点”,实际是操作系统和cURL的行为,不是Composer逻辑。
常见误解是以为改composer.json或设环境变量就能让Composer主动选IPv6或fallback到IPv4——它不会。只要DNS返回多个地址,cURL默认按RFC 6724规则排序(通常IPv6优先),但一旦IPv6连接超时或拒绝,是否退到IPv4取决于cURL版本和CURLOPT_IPRESOLVE设置,Composer不干预这个过程。
- cURL 7.62.0+ 默认启用
CURLOPT_IPRESOLVE = CURL_IPRESOLVE_WHATEVER,即由系统决定协议选择 - 若强制IPv4,需在运行时加
curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4),但Composer未暴露该钩子 - Composer的
HttpDownloader只传URL给cURL,不拆解host做预解析,也不重试不同IP版本
双栈失败时Composer不会自动切换镜像源
网络层失败(如IPv6 connect timeout、ICMP unreachable)触发的是cURL错误CURLE_COULDNT_CONNECT,Composer捕获后直接标记该请求STATUS_FAILED,然后走内置重试逻辑——但重试目标仍是**同一个URL的同一IP栈路径**,不是换镜像源。
也就是说,即使你配置了三个repositories,只要第一个源的域名在双栈下首次解析出IPv6且连不上,Composer会反复用IPv6重试(默认3次),而不是跳到第二个源或降级IPv4。这和5xx响应或404完全不同:后者才进源列表轮询,前者卡死在单个源上。
- 重试次数由
retry配置控制,默认3次,不可按协议栈区分设置 -
process-timeout影响的是整个下载任务,不是单次TCP连接超时 - 想绕过IPv6问题?只能提前让DNS只返回A记录,或用
hosts文件固定IPv4地址
企业级双栈高可用必须靠基础设施层兜底
真正可控的做法不是调Composer参数,而是把双栈决策前移到DNS或负载均衡器。比如:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用智能DNS(如阿里云云解析)根据客户端出口IP返回最优A/AAAA记录,避免终端盲目双栈试探
- Nginx upstream配
resolver+valid=30s,并开启ipv6=off强制只查A记录 - 私有镜像前端加一层反向代理,对外只暴露IPv4 VIP,内部再做双栈分发
- CI/CD机器统一禁用IPv6:
sysctl -w net.ipv6.conf.all.disable_ipv6=1
这些比折腾Composer配置更稳定。因为Composer的网络栈太薄——它连SOCKET级别的bind都不控制,更别说setsockopt(IPV6_V6ONLY)这种细节。
验证双栈行为的最简命令
别猜,直接看cURL怎么连:
curl -v https://repo.packagist.org/packages.json --resolve 'repo.packagist.org:443:2a02:fe8:1::1'
或者强制IPv4:
curl -v https://repo.packagist.org/packages.json --ipv4
对比两次响应头和耗时,就能确认当前环境真实走的是哪条栈。Composer的行为必然和这个一致——它只是cURL的封装壳。
双栈下的“高可用”从来不是Composer的责任,它是网络基础设施的事。强行在composer.json里堆repositories,只会让元数据合并变慢,还掩盖真实链路问题。










