curl error 60 是因 php openssl 找不到可信 ca 证书,需运行 php -r "print_r(openssl_get_cert_locations());" 确认 default_cert_file 路径有效,并在 php.ini 中同步配置 curl.cainfo 和 openssl.cafile 指向同一最新 cacert.pem 文件,重启服务后生效。

curl error 60:证书验证失败
这是 PHP 的 OpenSSL 扩展找不到可信 CA 证书导致的,不是 Composer 配错了源,而是 curl 根本无法校验 HTTPS 服务器身份。常见于 macOS Homebrew PHP、Alpine 容器、Windows XAMPP 等环境。
先确认问题根源:php -r "print_r(openssl_get_cert_locations());",重点看 default_cert_file 值是否为空或指向不存在的路径。
- Windows:下载
cacert.pem(从 curl.se),在 php.ini 里加一行curl.cainfo = "C:/path/to/cacert.pem",注意用双引号、路径可用正斜杠 - macOS(Homebrew):运行
brew install ca-certificates,然后查证书路径(通常为/opt/homebrew/etc/ca-certificates/cert.pem或/etc/ssl/cert.pem),设进 php.ini - Linux(Debian/Ubuntu):执行
sudo apt install ca-certificates,证书默认在/etc/ssl/certs/ca-certificates.crt,配curl.cainfo = "/etc/ssl/certs/ca-certificates.crt" - 临时验证(仅调试):
php -d curl.cainfo=/etc/ssl/certs/ca-certificates.crt composer install
别用 composer config -g secure-http false 或改 composer.json 关 HTTPS——这会降级全部源到 HTTP,有中间人劫持风险。
curl error 7 或 Connection refused
请求压根没发出去,或发出去后对方没响应。和 Composer 版本、PHP 扩展无关,纯属网络链路断了。
第一步不是改配置,而是跑两行命令定位:
-
ping packagist.org→ 若返回unknown host,说明 DNS 解析失败,立刻换 DNS(如8.8.8.8) -
curl -I https://packagist.org→ 若卡住或报Failed to connect,大概率是防火墙、代理或企业网络策略拦截
国内用户直连基本不可用,必须切镜像。验证是否真生效:composer config -g repo.packagist 输出必须是完整 JSON,例如 {"type": "composer", "url": "https://mirrors.aliyun.com/composer/"};缺斜杠、少 type、没加 -g 都会导致静默失效。
换源后必做:composer clear-cache。否则旧 provider 地址仍会被复用。
curl error 28 或超时卡在 “Downloading”
http.timeout 只控制元数据请求(如 GET /packages.json),不影响后续 git clone 下载包代码——那部分由 Git 自己管。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
如果卡在下载某个具体包(比如 cloning https://github.com/... ),问题不在 Composer,而在 Git:
- 查 Git 超时设置:
git config --get core.sshCommand - 加 SSH 连接超时:
git config --global core.sshCommand "ssh -o ConnectTimeout=30" - 若走 HTTPS 克隆失败,可临时配 Git 代理:
git config --global http.proxy http://127.0.0.1:1080
注意:composer install -vvv 2>&1 | grep -i "host\|mirrors" 可看到实际访问的域名——如果还是 packagist.org,检查项目根目录 composer.json 是否含 "repositories" 字段(哪怕空数组 []),有就删掉或临时执行 composer config --unset repositories。
404 Not Found 或 file could not be downloaded
404 不代表包不存在,而是你拼出了非法 URL。最常见原因:镜像地址漏了末尾斜杠。
阿里云镜像正确写法是 https://mirrors.aliyun.com/composer/,写成 https://mirrors.aliyun.com/composer(少 /)会导致请求路径变成 /composerpackages.json,直接 404。
验证镜像是否可用:curl -I https://mirrors.aliyun.com/composer/packages.json,必须秒回 HTTP/2 200。返回 HTML 页面(如人机验证)或 404,说明该镜像不适合自动化场景。
已停服的源(如 https://packagist.phpcomposer.com、https://laravel-china.org)自 2022 年起固定返回 404,必须停用。
删 vendor/ 和 composer.lock 再重装——因为 composer.lock 里硬编码了旧 provider 地址,不清除它,换源也白搭。
真正容易被忽略的是配置优先级:项目级 composer.json 中的 repositories 字段会完全覆盖全局镜像设置,且不报任何警告。只要项目里有这个字段,composer config -g repo.packagist 就形同虚设。










