答案是:composer diagnose 无法验证镜像连通性,因其强制访问 packagist.org 而忽略配置;真实测速须用 curl 或 PHP curl 对镜像 /packages.json 发起 HEAD 请求并统计 STARTTRANSFER_TIME。

直接结论:别用 composer diagnose 测镜像连通性,它只连 packagist.org,和你配的镜像无关;真实测速必须用 curl 或 PHP curl 对各镜像的 /packages.json 端点发起 HEAD 请求,统计 CURLINFO_STARTTRANSFER_TIME。
为什么 composer diagnose 不能验证镜像是否可用
composer diagnose 默认强制访问 https://packagist.org,完全忽略 composer config -g repo.packagist 或 repositories 配置。即使你已切到清华源,它仍会报 curl error 7: Failed to connect to packagist.org——这不是故障,是设计如此。
它真正有用的检查项只有三类:PHP version、OpenSSL、curl 扩展是否存在,这些不依赖网络。
- 想确认镜像是否真能用,得手动发请求:
curl -I https://mirrors.tuna.tsinghua.edu.cn/composer/packages.json - 如果返回
HTTP/2 200且有Content-Type: application/json,说明基础通路正常 - 如果卡住、超时或返回
404,问题出在 DNS、代理、TLS 握手或镜像自身(如已停用的phpcomposer.com)
自制 curl 测速脚本的关键参数与坑
Linux/macOS 下可直接运行的测速脚本核心逻辑是并发请求各镜像的 /packages.json,提取真实响应耗时。不是 ping,也不是 curl -w "%{time_total}",因为后者含 DNS 解析时间,干扰大。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 必须用
-I(HEAD)而非-s -o /dev/null(GET),避免下载完整 JSON 浪费带宽 - 超时必须设
-m 5,防止某个镜像卡死拖慢整个流程 - 耗时指标应取
CURLINFO_STARTTRANSFER_TIME(PHP)或%{time_starttransfer}(curl),它反映服务端响应首字节的时间,最贴近 Composer 实际行为 - URL 必须带
/packages.json后缀,例如https://mirrors.aliyun.com/composer/packages.json;根路径如/composer/可能重定向或返回 HTML,不可比 - 阿里云、腾讯云、清华、SJTUG 四个地址目前都有效;
phpcomposer.com和laravel-china.com已停用,测了也白测
用 PHP 脚本做钩子自动切换镜像的实操要点
把测速逻辑嵌入 Composer 钩子(pre-install-cmd / pre-update-cmd)可行,但必须绕过几个隐蔽陷阱:
- 钩子脚本必须返回
0,否则后续install或update会被中断;建议用try/catch包裹所有curl操作,并在异常时 fallback 到默认镜像 - 不要用
exec('composer config repo.packagist ...')直接改全局配置,会污染其他项目;应加--global参数明确作用域,或更稳妥地写入当前项目composer.json的repositories字段 - 测速结果建议缓存到本地文件(如
.mirror-cache),设置 1 小时过期,避免每次命令都重测 - 执行前务必
composer clear-cache,否则旧元数据可能让show -p返回空,误判为镜像失效
验证镜像是否生效的三步法
配完镜像别急着跑 install,先用这三步交叉验证:
- 查配置:
composer config -g repo.packagist输出必须是完整 JSON,含"type": "composer"和带尾斜杠的 HTTPS URL;返回空或null就是没写对 - 看行为:运行
composer show -p | head -5,如果能快速列出包名(如monolog/monolog),说明镜像通信成功;卡住或报Could not fetch就得回退查网络 - 抓实质:进项目目录删掉
vendor/和composer.lock,再跑composer install -vvv,观察日志里实际请求的 URL 是否为你配的镜像地址——这才是最终证据
镜像本身不解决 Resolving dependencies 卡顿,那属于依赖解析层问题;测速只管“能不能通”和“谁更快”,别指望它优化算法。

















