应使用curl并发请求各镜像的/packages.json端点,通过-m 5超时控制与-w "%{time_total}"精确提取总耗时,排序后取最小值对应URL;该脚本不依赖Composer,仅调用系统命令,输出纯URL供composer config直接使用。

Composer 中检测最快中文镜像的脚本原理
Composer 本身不提供网络测速能力,composer config 也不能自动选镜像;所谓“检测最快”,本质是用 curl 或 wget 并发请求各镜像的 packages.json(或空响应端点),记录 HTTP 状态码与耗时,再排序取首项。关键不是 Composer 功能,而是 shell 脚本 + 网络工具协作。
如何写一个可直接运行的测速脚本
以下脚本在 Linux/macOS 下可直接保存为 check-mirror.sh 并 chmod +x 执行。它不依赖 PHP 或 Composer 运行时,只调用系统命令:
#!/bin/bash
mirrors=(
"https://packagist.phpcomposer.com"
"https://packagist.laravel-china.com"
"https://mirrors.aliyun.com/composer/"
"https://mirrors.tuna.tsinghua.edu.cn/composer/"
)
for url in "${mirrors[@]}"; do
time=$(curl -s -o /dev/null -w "%{time_total}" -m 5 "$url/packages.json" 2>/dev/null)
if [[ -n "$time" && "$(echo $time | grep -E '^[0-9.]+$')" ]]; then
echo "$time $url"
else
echo "999.999 $url (timeout or 404)"
fi
done | sort -n | head -n1 | awk '{print $2}'
要点说明:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
packages.json是各镜像实际提供服务的稳定路径,比根路径更可靠(例如阿里云根路径返回 302,但packages.json直接返回 200) -
-m 5强制 5 秒超时,避免卡死;-w "%{time_total}"只提取总耗时,不含 DNS 解析等干扰项 - 输出结果是纯 URL,可直接传给
composer config repo.packagist composer $URL - Windows 用户需改用 PowerShell +
Measure-Command,且注意路径斜杠和 TLS 兼容性
为什么不能用 Composer 自带的 diagnose 或插件
composer diagnose 只检查本地配置与连通性,不测速;社区插件如 hirak/prestissimo 已停止维护,且其“多源并发”是下载加速,非镜像发现。真实场景中:
- 某些镜像(如 Laravel-China)已关闭,但旧教程仍列在首位,脚本里必须手动剔除失效地址
- 清华、阿里镜像支持 HTTPS,但部分企业内网会拦截证书校验,此时需加
-k参数,但会降低安全性 -
curl版本差异会影响-w格式输出,低于 7.49 的版本不支持%{time_total},需降级用%{speed_download}间接判断
集成到 Composer 流程中的注意事项
若想每次 composer install 前自动切最快镜像,不要直接 hook 到 scripts,因为 composer.json 的 scripts 在配置加载后才执行,此时镜像已固定。可行做法是:
- 用 shell 函数封装:定义 alias
alias cinst='composer config repo.packagist composer $(./check-mirror.sh) && composer install' - 在 CI 环境中,把脚本输出存为变量,再注入到
composer config步骤,注意避免缓存污染(如 GitHub Actions 中要清空~/.composer/cache) - 别把测速逻辑写进
composer.json的post-install-cmd——那会形成循环:装包 → 触发脚本 → 改配置 → 再触发…
真正容易被忽略的是 DNS 缓存:同一台机器多次运行脚本,可能因系统 DNS 缓存导致结果偏差;建议加 dig +short 验证各镜像 IP 是否真不同,再决定是否加 systemd-resolve --flush-caches(Linux)或 dscacheutil -flushcache(macOS)。

















