BGP抖动导致Composer卡在Downloading(0%),因路由频繁切换使TCP连接被静默中断,curl无法收到FIN包而仅等待超时;需通过curl测镜像、traceroute查跳点、dig验DNS定位异常,再以换DNS、强制IPv4、降并发三步临时绕过,长期应设http.timeout=300、max-retries=2并禁用TLS 1.3提升网络钝感度。

为什么BGP抖动会让Composer卡死在Downloading(0%)
BGP抖动不是“网慢”,而是路由表频繁切换导致TCP连接中途断开,curl收不到FIN包,只等超时——Composer默认http.timeout是60秒,process-timeout是300秒,远低于BGP收敛时间(常达2–5分钟)。此时cURL error 28: Operation timed out反复出现,但-vvv日志里看不到HTTP响应头,说明请求根本没发出去,或发出去后被中间节点静默丢弃。
怎么验证当前BGP路径是否异常
别直接跑composer install,先定位链路问题:
- 用
curl -I -w "\n%{http_code}\n" -s https://mirrors.aliyun.com/composer/packages.json测镜像根路径,返回非200就说明BGP已绕行到劣质出口 - 执行
traceroute mirrors.aliyun.com(Linux/macOS)或tracert mirrors.aliyun.com(Windows),看第3–6跳是否出现* * *或延迟突增>300ms - 查本地DNS是否被污染:
dig mirrors.aliyun.com +short,若返回IP不在阿里云官方段(如118.178.162.124、118.178.162.125等),就得换DNS
临时绕过BGP抖动的三步操作
不能靠重试硬扛,得主动切路径:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 改DNS:临时设为
223.5.5.5(阿里公共DNS)或114.114.114.114(注意部分地区114会劫持,优先选前者) - 强制走IPv4:
export COMPOSER_HOME=~/.composer(Linux/macOS)后,在~/.composer/config.json里加"github-protocols": ["https"]并删掉git协议项,避免IPv6 fallback失败 - 降并发保稳定:
composer install --prefer-dist --no-plugins --no-scripts -n --max-workers=2,把并发从默认4压到2,减少TCP连接数对BGP路径的压力
长期应对BGP抖动的配置要点
单靠镜像源URL不够,得让Composer对网络波动更“钝感”:
-
composer config -g http.timeout 300(不是600,BGP抖动超5分钟基本不可恢复,设太高只会卡更久) -
composer config -g retry-auth-failures false(BGP抖动不涉及认证,开这个反而增加无效重试) -
composer config -g http.max-retries 2(BGP抖动下重试3次以上大概率还是走同一条劣质路径) - 禁用TLS 1.3:
export PHP_CURL_SSL_VERSION=TLSv1.2(某些BGP绕行节点对TLS 1.3握手支持不全,降级可提升握手成功率)
BGP抖动本质是运营商层问题,Composer能做的只是减少对它的敏感度——关键动作永远在DNS、出口IP和并发控制上,而不是调高timeout或加retry。镜像URL写得再漂亮,路由不通照样0 B/s。

















