最简单有效的批量测试方式是循环调用curl,但必须加超时、DNS隔离和状态码校验;并发测需用parallel或GuzzleHttp/Promises控制并发数与错误聚合,避免仅用shell&后台导致不可控。

直接写循环调用 curl 测多个镜像源是最简单有效的批量测试方式,但必须加超时、DNS 隔离和状态码校验;并发测不能靠 shell 的 & 简单丢后台,得用 parallel 或 PHP 的 GuzzleHttp/Promises 控制并发数与错误聚合。
用 curl 循环测多个 Composer 镜像源(基础版)
核心是复用单点测试逻辑,避免每个请求被 DNS 缓存或连接复用干扰:
-
curl -o /dev/null -s --connect-timeout 5 --max-time 10 --no-keepalive --dns-servers 8.8.8.8 -w "%{http_code} %{time_total}s" URL是每轮必须的参数组合 -
000表示连接失败(DNS 解析失败 / TCP 握手超时),不是 HTTP 状态码,不能和403混为一谈 - 阿里云已将路径从
/composer/迁至/php/composer/,腾讯云要求User-Agent含Composer/,否则返回403 - 建议先用
printf构造 URL 列表,再用while read逐行处理,避免空格或特殊字符导致解析错乱
用 parallel 实现可控并发检测(推荐)
比纯 shell & 更可靠:能限制并发数、统一超时、捕获各进程退出码,且输出可排序对齐:
- 安装:
apt install parallel(Debian/Ubuntu)或brew install parallel(macOS) - 命令示例:
printf '%s\n' https://mirrors.aliyun.com/php/composer/ https://mirrors.tencent.com/composer/ | parallel -j 3 --timeout 12 'curl -o /dev/null -s --connect-timeout 5 --max-time 10 --no-keepalive -w "%{url_effective} %{http_code} %{time_total}s\n" {} 2>/dev/null || echo "{} 000 -s" -
-j 3表示最多 3 个并发,防止触发镜像限速;--timeout 12是整个 parallel 命令总耗时上限 - 注意:某些镜像(如华为云)会根据
User-Agent返回不同内容,需加-H "User-Agent: Composer/2.7.0"才算真实可用
用 GuzzleHttp/Promises 做 PHP 端并发校验(适合 CI 集成)
优势是能复用 Composer 自身的 HTTP 客户端配置(如 proxy、CA bundle)、自动重试逻辑,且结果可直接喂给后续流程:
- 先装依赖:
composer require guzzlehttp/guzzle guzzlehttp/promises --dev - 脚本中构造 Promise 数组,每个
$client->head()请求镜像根路径,用Promise\settle()统一等待 - 关键判断不止是
200:要检查Content-Type是否含application/json或text/html(后者大概率是反爬跳转页) - 别漏掉证书验证:
curl: (60) SSL certificate problem在 CI 中很常见,需在 client 配置里显式设'verify' => false(仅测试环境)或更新 CA 包
为什么 HTTP 200 不等于“能装包”?
真实拉包能力必须走一次 composer install --dry-run,否则会误判:
- 有些镜像(如旧版 phpcomposer.com)返回
200+ HTML 页面,Content-Type: text/html,但实际不支持 packagist 协议 - 必须伪造最小
composer.json,指定repositories并强制走目标镜像,再跑COMPOSER_HOME=/tmp/test composer install --no-plugins --no-scripts --dry-run - 成功标志是输出里有
Writing lock file或Generating autoload files;失败时重点看Could not fetch后面的 URL 是否仍指向原镜像(说明未生效) - 这个步骤无法并发——
composer install本身是串行锁文件操作,只能放在最后单点验证
真正难的不是并发发请求,而是区分“连得上”“返回对”“协议通”“能装包”这四层;漏掉任何一层,自动化检测就只是个好看的数字。


















