curl error 28本质是网络请求超时,需调大http.timeout值(如600秒)或换用国内镜像源;非证书/代理问题,常见于DNS慢、TLS握手卡顿或网络抖动。

Composer 报错 curl error 28,本质是网络请求超时,不是证书或代理配置错误——直接调大超时阈值最有效。
为什么出现 curl error 28
这是 cURL 返回的「operation timeout」错误,表示 Composer 在等待远程服务器响应时超过了默认时限。常见于国内访问 packagist.org 或 GitHub 时 DNS 解析慢、TLS 握手卡顿、或中间网络抖动,而非完全连不上。
- 默认超时值极低:
default_socket_timeout(PHP)和 cURL 的CURLOPT_TIMEOUT均为 300 秒,但 Composer 自身还设了更激进的http.timeout默认值(约 60 秒) - 不是所有超时都报
28:若卡在 DNS 阶段,可能表现为curl error 6;若 TLS 握手失败,可能是35或60 - 运行
composer diagnose通常不会暴露该问题,因为它只检测基础连接,不模拟真实包下载流程
临时解决:命令行加 --timeout 参数
适用于单次安装或更新,不修改全局配置,适合 CI/CD 或临时调试。
- 给整个命令设超时:
composer install --timeout=600(单位秒) - 仅对网络阶段生效:
composer update --http-timeout=600(注意是--http-timeout,不是--timeout) - 若同时遇到 DNS 慢,可搭配
--dns-cache-ttl=3600减少重复查询
永久生效:修改 Composer 全局配置
避免每次敲长参数,尤其适合团队统一环境或本地开发机。
- 执行
composer config -g http.timeout 600设置全局 HTTP 超时 - 顺带加固:
composer config -g github-oauth.github.com "your_token"(如有 GitHub Token,能绕过限速) - 配置文件位置:
~/.composer/config.json(Linux/macOS)或%USERPROFILE%\AppData\Roaming\Composer\config.json(Windows),可手动编辑确认"http": {"timeout": 600}已写入 - 注意:该配置不影响
composer self-update,它走独立逻辑
比超时更关键的底层优化
单纯拉长超时只是兜底,真正提升稳定性得从网络链路入手。
- 换镜像源是首选:
composer config -g repo.packagist composer https://packagist.phpcomposer.com(已停用)→ 改用https://mirrors.aliyun.com/composer/或https://packagist.laravel-china.org(后者已归档,推荐阿里云) - 禁用 IPv6 可缓解部分运营商 DNS 异常:
echo 'precedence ::ffff:0:0/96 100' | sudo tee -a /etc/gai.conf(Linux) - 若用 Docker,宿主机 DNS 不稳定时,在
docker run加--dns 223.5.5.5或改/etc/docker/daemon.json - 不要盲目开
composer config -g secure-http false:这会降级到 HTTP,有中间人风险,且新版 Composer 已强制要求 HTTPS
超时值设太高(如 3600)反而会让失败更难定位;真正卡住时,应优先查镜像源可用性、DNS 解析结果、以及是否触发了 GitHub 的 API 限流(403 rate limit exceeded)。curl error 28 往往是表象,背后常混着多个网络层问题。










