composer diagnose 显示失败但 install 成功,因其硬编码只连 https://packagist.org,不读镜像源、repositories 配置或环境变量,仅验证官方源连通性,而非实际使用的源。

换镜像源 + 清缓存是解决 90% “连不上” 问题的起点,但不是万能解药;真正卡住的地方往往在 DNS、Git 克隆、GitHub API 限流或项目级 repositories 覆盖上。
为什么 composer diagnose 显示失败,但 composer install 却能跑?
因为 composer diagnose 硬编码只连 https://packagist.org,完全不读你配的镜像源、composer.json 里的 repositories,也不认 COMPOSER_REPO_PACKAGIST 环境变量。它测的是“官方源通不通”,不是“你实际用的源通不通”。
- 想验证当前镜像是否生效:直接跑
composer show -p | head -5,它会真实走你配置的源 - 临时让
diagnose测镜像:先composer config --global --unset repos.packagist,再运行diagnose - 某些企业代理会拦截
User-Agent: Composer/2.x,静默丢包——这时diagnose报错但没提示,得靠curl -v https://mirrors.aliyun.com/composer/packages.json手动确认
Could not resolve host 或 Connection timed out 怎么快速定位?
这类报错本质是网络层失败(DNS 解析或 TCP 连接卡住),和 composer.json 写法、PHP 版本、缓存都无关。别急着改配置,先确认“能不能通网”。
- 执行
ping packagist.org:返回unknown host→ DNS 问题,换8.8.8.8或114.114.114.114 - 执行
curl -I https://packagist.org:卡住或报Failed to connect→ 防火墙、代理或网络策略拦截,手机热点一试便知 - 公司/学校网络下,
https://github.com和https://packagist.org常被统一屏蔽,别只盯着 Composer 配置
换了镜像还报 403 或 cURL error 28?注意这三处覆盖点
镜像源只是第一道关,后面还有 Git 克隆、GitHub API、项目级配置三重干扰,它们各自超时逻辑和认证机制完全不同。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
-
repositories在composer.json里硬编码了?它的优先级高于全局镜像,会直接覆盖你设的阿里云地址;删掉或改成可用地址才能生效 - cURL error 28 看似超时,但 Composer 分两步:HTTP 元数据请求(受
http.timeout控制)和 Git 克隆(由 Git 自己决定超时);改composer config -g http.timeout 600对后者完全无效 - 报 403?大概率是 GitHub API 限流(未认证请求仅 60 次/小时)或 Token 权限不足;检查
curl -I -H "Accept: application/vnd.github.v3+json" https://api.github.com/rate_limit,剩余为 0 就得配github-oauth.github.com
清华/阿里镜像末尾斜杠、旧镜像停用这些细节真会 404
镜像 URL 的小错误会导致稳定返回 404,而不是跳转或报错,容易误判为“网络不通”。
- 清华镜像必须带末尾
/:https://mirrors.tuna.tsinghua.edu.cn/composer/,少一个就 404 -
https://packagist.phpcomposer.com和https://packagist.laravel-china.org已于 2023 年底下线,还在用必出错 - 腾讯云镜像地址是
https://mirrors.cloud.tencent.com/composer/,不是tencent.com/composer或其他变体 - 换完镜像后务必
composer clear-cache,否则 Composer 可能从旧缓存读失效地址
最常被忽略的其实是 Git 克隆那一步——它不走 Composer 配置,不受镜像源影响,也不认 http.timeout,出问题只能调 Git 自身设置或强制 zip 下载。排查时得把 HTTP 和 Git 当成两个独立系统来看。










