最准方式是执行composer install -vvv 2>&1 | grep "get\|downloading",真实请求url以第一行成功返回200的get /p2/...为准,镜像url末尾必须带/,否则静默404并fallback至官方源。

怎么看 Composer 实际请求了哪个镜像
最准的方式是加 -vvv 跑一次真实操作,别信配置、别信锁文件、别信 composer diagnose 的输出。执行:composer install -vvv 2>&1 | grep "GET\|Downloading",终端会逐行打印 HTTP 请求 URL。
关键识别点:
- 出现
GET https://mirrors.aliyun.com/composer/p2/monolog/monolog.json→ 真正走阿里云镜像 - 出现
GET https://repo.packagist.org/p2/monolog/monolog.json→ fallback 到官方源(镜像缺失或不可用) - 出现
Cloning https://github.com/xxx/yyy.git→ 是 source 安装,和镜像无关
注意:哪怕你配了清华源,只要某包在该镜像中没同步,Composer 就会静默切回官方源,且不报错、不提示、不改配置。
为什么 composer config repo.packagist 显示正常但日志里还是连官方源
常见原因不是命令没生效,而是配置被绕过或覆盖了。必须检查三件事:
-
composer.json里是否定义了repositories字段?只要存在(哪怕空数组[]),就会**完全屏蔽全局镜像**,此时得查composer config repo.packagist(不带-g)确认项目级配置 - Composer ≥ 2.2 后,键名必须是
repo.packagist(单数),写成repos.packagist会静默忽略——不报错也不生效 - 环境变量是否覆盖?Linux/macOS 运行
echo $COMPOSER_REPO_PACKAGIST,Windows 运行echo %COMPOSER_REPO_PACKAGIST%;如果输出非空(比如https://packagist.org),那无论配置文件怎么写,实际都走这个地址
还有一种隐蔽情况:某些镜像服务端对未命中缓存的请求会 302 重定向到 repo.packagist.org,composer diagnose 看不出,但 -vvv 日志里能看到跳转后的最终 URL。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
如何区分元数据请求和包下载请求
Composer 的慢,90% 卡在元数据请求阶段(p2/xxx.json),不是 ZIP 下载慢。日志里这两类请求特征明显:
- 元数据请求:以
GET https://.../p2/vendor/package-name.json或GET https://.../packages.json开头,通常出现在Resolving dependencies阶段之后、真正下载前 - 包下载请求:以
Downloading https://.../dist/vendor/package-name/xxx.zip开头,发生在依赖解析完成后
如果你看到大量 GET /p2/... 请求失败或超时,说明问题出在镜像元数据同步上,不是网络带宽或 dist 缓存问题。此时应优先验证镜像站本身是否返回 200,比如:curl -I https://mirrors.aliyun.com/composer/p2/monolog/monolog.json。
日志里出现多个 GET 请求,哪个才代表真实来源
Composer 2.2+ 启用了「只读代理」机制:即使你配了镜像,它仍可能向 packagist.org 发起 HEAD 请求校验元数据有效性。所以日志里同时出现镜像和官方源的 GET 是正常现象。
真正决定包来源的是最后那个成功返回 200 的 GET /p2/... 请求,不是第一个、也不是最多次的那个。重点看:
- 哪个 URL 返回了完整 JSON(比如含
"packages"字段) - 哪个 URL 后紧跟
Downloading行(说明它被用于解析版本) - 如果镜像返回 404 或空响应,而官方源返回了数据,那包就是从官方源拉的,哪怕你配了镜像
最容易被忽略的一点:镜像 URL 末尾必须带 /,https://mirrors.aliyun.com/composer ❌ 和 https://mirrors.aliyun.com/composer/ ✅ 是两个不同地址,少斜杠会导致所有元数据请求 404,但 Composer 不会明确报错,只会 fallback。










