答案是网络底层连通失败,需先用ping和curl验证DNS与TLS连通性,再确认镜像URL末尾带/、清缓存、删vendor和composer.lock,并检查归属权与代理干扰。

报“Connection refused”或cURL error 7,先别碰composer config
这不是 Composer 配错了,是系统压根没连出去。DNS 解析失败、防火墙拦截、代理干扰都会导致这个现象,跟 repo.packagist 配得对不对无关。
立刻执行两步验证:
-
ping packagist.org—— 如果返回unknown host,说明 DNS 挂了,直接改/etc/resolv.conf加nameserver 8.8.8.8(Linux/macOS)或在 Windows 网络适配器里手动设 DNS -
curl -v https://mirrors.aliyun.com/composer/—— 卡在* Connected to是网络层不通;卡在* TLS handshake是 OpenSSL 或 CA 证书问题
企业 HTTPS 解密代理环境下,可临时加 COMPOSER_DISABLE_TLS=1 验证是否卡在证书校验,但仅限调试,不可长期启用。
镜像配了却没生效,检查三个硬条件是否全满足
Composer 静默 fallback 到官方源不报错,90% 是因为镜像配置漏了关键细节。必须同时满足:
- 键名必须是
repo.packagist(不是repos.packagist或repositories.packagist) - 命令末尾必须显式传
composer类型值:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 必须是 HTTPS 且以
/结尾:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(拼路径会变成/composerpackages.json,404)
配完立刻验证:composer config -g repo.packagist 应输出完整 JSON 对象,例如:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。如果输出为空、null 或仍是官方地址,说明根本没写进去。
报“Permission denied”写 vendor/ 或 composer.lock
99% 是目录归属权被 sudo 污染了。比如你用 root 跑过一次 composer install,vendor/ 和 composer.lock 就变成 root 所有,之后普通用户再运行就被拒。
最快定位方式:看报错里带路径的那一行,例如 file_put_contents(/path/to/vendor/autoload.php): Permission denied → 直接 ls -ld /path/to/vendor,如果 owner 是 root,就是归属问题,不是权限数字不对。
修复命令(Linux/macOS):sudo chown -R $USER:$USER /path/to/project。别乱 chmod 777——这治标不治本,还可能触发 Composer 安全警告。
CI/CD 或宝塔环境特别注意:你用 root 配的全局镜像,但实际执行的是 www 用户,得用 sudo -u www composer config -g repo.packagist 单独配。
卡在 “Loading composer repositories”,别信 composer diagnose
composer diagnose 只对 https://packagist.org 发一次 HTTP HEAD 请求(走 80 端口),不校验 HTTPS、不读你的镜像配置、也不模拟真实依赖解析链路。它通过 ≠ 你实际要用的链路通。
真正卡点在 Loading composer repositories 阶段,本质是 DNS 解析失败,或 TLS 握手卡在 OpenSSL 层。http.timeout 参数此时完全无效。
闭环验证两步走:
- 运行
php -r "print_r(openssl_get_cert_locations());",紧盯default_cert_file和ini_cafile字段:是否为空?路径是否存在?文件大小是否 ≤10KB?(过小说明是空包或陈旧 bundle) - 再跑
curl -v https://packagist.org/packages.json:如果也报SSL certificate problem: unable to get local issuer certificate,说明问题出在 PHP/cURL 层级,跟 Composer 配置、代理、DNS 全都无关
Windows 用户尤其注意:XAMPP/WAMP 自带的 curl-ca-bundle.crt 多数停更于 2021 年,不含 ISRG Root X1 等现代根证书。php.ini 中必须同时配齐 curl.cainfo 和 openssl.cafile,且指向同一有效 cacert.pem 文件(绝对路径),缺一不可。


















