cURL error 28主因是镜像未生效而静默回退官方源:键名错(repos.packagist)、漏type值composer、URL缺末尾/,三者任一出错即fallback;验证须输出完整JSON且-vvv日志首行GET指向镜像域名。

为什么换镜像后还是cURL error 28
换源不生效是超时反复出现的主因——composer config -g repo.packagist写错一个字符就静默回退到packagist.org。常见失效点有三个:repos.packagist(多s)、漏掉composer类型参数、URL末尾缺/。比如https://mirrors.aliyun.com/composer少斜杠,会拼出//packages.json导致404,但Composer不报错,只卡在Downloading。
验证是否真生效:运行composer config -g repo.packagist,输出必须是形如{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}的完整JSON。空、null或仍显示packagist.org,说明没配进去。
项目级配置更可靠:直接编辑composer.json,在根节点加"packagist.org": false,并在repositories数组里追加{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}。改完删掉vendor/和composer.lock,再跑composer install -vvv看请求地址是否含mirrors.。
http.timeout和process-timeout到底管什么
http.timeout控制HTTP请求(查packages.json、下载dist包),单位秒;process-timeout管外部命令(git clone、unzip),不是HTTP卡住时该调的参数。很多人只改process-timeout,结果仍停在Downloading https://...——那一步走的是HTTP,得调http.timeout。
全局设置建议:composer config -g http.timeout 600(10分钟);composer config -g process-timeout 1200(20分钟)。项目级覆盖则在composer.json的config字段里写"http.timeout": 600和"process-timeout": 1200。
临时调试可用环境变量:COMPOSER_HTTP_TIMEOUT=600 COMPOSER_PROCESS_TIMEOUT=1200 composer install。注意COMPOSER_TIMEOUT已弃用,新版无效。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
curl -v和nslookup才是定位卡点的第一步
看到cURL error 28: Operation timed out after 300000 milliseconds别急着改参数——300秒已经很长,大概率是根本没发出去。先跑curl -v https://mirrors.aliyun.com/composer/packages.json:
- 卡在
* Trying 114.114.114.114:443→ DNS或TCP不通,用nslookup mirrors.aliyun.com查解析 - 卡在
* Connected to mirrors.aliyun.com (114.114.114.114) port 443 (#0)之后 → TLS握手或HTTP响应慢,可能是杀软HTTPS扫描或代理干扰 - 手动
curl也卡?试curl --resolve mirrors.aliyun.com:443:114.114.114.114 https://mirrors.aliyun.com/composer/packages.json强制DNS,排除本地污染
开发机开了Charles/Fiddler必须关掉——Composer不读HTTP_PROXY,但系统级curl会继承,导致SSL验证失败+静默超时。
Cloning into卡住不是Composer超时问题
如果-vvv日志停在Cloning into 'xxx',说明已进入git clone阶段,http.timeout完全不管用。此时超时由Git自己控制,和Composer配置无关。
查具体包拉取方式:composer show vendor/package --all | grep -A5 source。若"source": {"type": "git", "url": "git@github.com:..."},就得调Git参数:
- SSH方式:设
export GIT_SSH_COMMAND="ssh -o ConnectTimeout=30 -o ServerAliveInterval=30" - HTTPS方式:设
git config --global http.postBuffer 524288000(500MB),并确认github-protocols设为["https"]
更隐蔽的问题:某些CI环境(如Docker容器)默认没装Git或SSH key未挂载,也会表现为Cloning卡死,而非超时错误。

















