Composer下载慢主因是IPv6解析超时,禁用IPv6最有效:设COMPOSER_NO_IPV6=1(2.2+原生支持),或配use-ipv4 true;换阿里云镜像+强制IPv4解析更稳。

Composer 下载慢,八成不是网速问题,而是卡在 IPv6 解析和连接 fallback 上——它先花几秒尝试 ::ffff:185.199.108.153 这类地址,超时后才切到 IPv4。禁用 IPv6 解析比等它自动回退快得多,且无副作用。
COMPOSER_NO_IPV6=1 是最直接有效的临时方案
这是 Composer 2.2+ 原生支持的开关,不依赖 cURL 版本或 PHP 编译选项,命令执行完即生效,不影响其他进程:
- 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
该变量只跳过 IPv6 地址解析逻辑,不改 DNS、不碰系统配置,CI/CD 中也推荐用这种“单次有效”方式,避免污染构建环境。
use-ipv4 true 配置项适合长期项目
写入配置后,所有后续命令默认走 IPv4,但仅对 Composer 2.2+ 有效;Composer 1.x 完全忽略此配置,必须退回用环境变量:
- 当前项目生效:
composer config use-ipv4 true(写入composer.json的config字段) - 全局生效:
composer config -g use-ipv4 true(写入~/.composer/config.json)
注意:已有 composer.lock 中记录的源 URL 不会自动更新,但下次 update 或 require 时会按新规则解析。
CURL_IPRESOLVE=4 有时无效,别盲目套用
这个环境变量看似通用,但实际生效条件苛刻:
- PHP 必须启用 cURL 扩展,且
curl_version()['features'] & CURL_VERSION_IPV6返回非零值(说明编译时支持 IPv6) - libcurl 版本需 ≥ 7.19.4;低于此版本该选项被完全忽略
- Composer 2.2+ 默认用 cURL,但若你启用了自定义 HTTP 客户端(如 Guzzle),
CURL_IPRESOLVE就不生效
相比之下,COMPOSER_NO_IPV6=1 是 Composer 自己在解析阶段就过滤掉 IPv6 地址,更底层、更可控。
换阿里云镜像 + 强制解析为 IPv4 是最稳组合
镜像源本身已做协议适配,再配合 DNS 层控制,能彻底避开 IPv6 路由异常:
- 全局换源:
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - 验证是否真走 IPv4:
ping mirrors.aliyun.com,输出应为类似118.31.67.205的地址,而非240e::开头 - 若仍解析出 IPv6,可手动写入 hosts:
118.31.67.205 mirrors.aliyun.com(路径:Linux/macOS 为/etc/hosts,Windows 为C:\Windows\System32\drivers\etc\hosts)
真正起效的永远是「让域名解析不出 IPv6 地址」,而不是教 Composer 学会选路——这点容易被忽略,但恰恰是根因。











