配置国内镜像本身不能“防”超时,它只是把原本要跨海连 packagist.org 的请求换成直连国内服务器——物理距离短、dns 解析快、tls 握手稳,自然就不容易卡在 curl error 28 或 could not fetch 上;镜像生效需满足 repo.packagist(单数)、type 为 composer、url 以 https:// 开头且末尾带斜杠三条件,否则静默回退官方源;配置后必须验证输出为完整 json 并清理缓存、检查项目级 repositories 覆盖、确认流量真实走镜像,同时合理设置 http.timeout=600(治网络请求超时)与 process-timeout=1200(治命令生命周期卡顿),ipv6 干扰时需启用 composer_ipv4=1。

配置国内镜像本身不能“防”超时,它只是把原本要跨海连 packagist.org 的请求,换成直连国内服务器——物理距离短、DNS 解析快、TLS 握手稳,自然就不容易卡在 cURL error 28 或 Could not fetch 上。
为什么默认连 packagist.org 必然容易超时
不是你网络差,是链路设计没适配国内环境:
- DNS 解析常被污染或延迟高,
ping packagist.org都可能超时或返回错误 IP - TLS 握手阶段卡住(
* TLS handshake停住)很常见,尤其在 WSL2、公司内网或证书链不全的系统上 - 首字节响应(TTFB)动辄 5–10 秒,
http.timeout默认 300 秒根本撑不住深层依赖链(比如 ThinkPHP → ORM → View 层) - 镜像站用 CDN 和本地缓存,
packages.json和 dist 包都走边缘节点,HTTP/2 + gzip 也更友好
composer config -g repo.packagist 这条命令到底在改什么
它不是简单换 URL,而是在全局配置里写入一个「源描述对象」,Composer 2.0+ 对字段要求极严:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
repo.packagist必须是单数,写成repos.packagist或repositories.packagist.org都无效 - 中间的
composer是type值,漏掉就会静默 fallback 到官方源,composer diagnose会报Repo is not configured properly - URL 必须以
https://开头且末尾带斜杠:https://mirrors.aliyun.com/composer/✅,少斜杠就拼成/composer/packages.json直接 404 - 执行后必须用
composer config -g repo.packagist验证输出是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
镜像生效了,但还是超时?先查这三件事
镜像配置正确 ≠ 流量真走镜像,常见干扰项比想象中多:
- 项目级
composer.json里有"repositories"字段?它会**完全覆盖**全局配置,哪怕只写了一行"packagist.org": false也会让镜像失效 - 缓存没清干净:旧的
packages.json、provider-*.json还在~/.composer/cache/repo/https---packagist.org/里,Composer 会继续尝试连海外源 - 流量没走镜像:运行
composer install -vvv | grep -i "mirrors.aliyun",没输出就说明仍在直连,此时调http.timeout毫无意义
http.timeout 和 process-timeout 别乱设
这两个参数作用层完全不同,混用等于白调:
-
http.timeout控制单次 HTTP 请求总耗时(DNS + TCP + TLS + 响应头),专治cURL error 28和Could not fetch类错误,建议设为600 -
process-timeout控制整个命令生命周期(依赖解析、下载、解压、执行脚本),卡在Generating autoload files后不动才调它,建议1200 -
process-timeout超过7200秒会被 Composer 硬编码回退到300秒,设再大也没用
真正卡住的地方,往往不是镜像选得不对,而是缓存残留、项目配置覆盖、或 IPv6 干扰(国内多数镜像对 IPv6 支持不完整,加 COMPOSER_IPV4=1 才能稳)。动手前先跑一遍 composer config -g -l 和 composer config -l 对比,比反复重试快得多。










