Composer代理异常时静默fallback至过期缓存或官方源,导致安装慢、报错、找不到包;因其对HTTP失败不报错,而是跳过镜像、启用过期缓存、最终回退packagist.org。

Composer 在代理异常时不会报错,而是静默 fallback 到过期缓存或官方源——这导致你明明配了镜像,composer install 却仍慢、报错、找不到包。
为什么代理异常后 Composer 会“假装正常”?
Composer 对 HTTP 请求失败(超时、4xx、5xx、非 JSON 响应)不抛出明确错误,而是直接放弃该镜像,退回到本地缓存(哪怕已过期 7 天),再 fallback 到 https://packagist.org。企业代理常劫持 HTTPS 请求,返回 HTML 登录页或空响应,packages.json 解析失败后就被跳过,用户完全感知不到中间发生了什么。
- 代理返回
text/html而非application/json→ Composer 静默丢弃该镜像 -
curl -I https://mirrors.aliyun.com/composer/packages.json返回302或403→ Composer 不输出状态码,只当“不可用” - 代理重写 Host 头或 URL 路径(如把
mirrors.aliyun.com改成内部网关地址)→ 缓存路径错位,clear-cache也清不到对应目录
如何确认是代理在中间“动手脚”?
别信 composer diagnose,它只测 packagist.org,和你配的镜像无关。真实验证就两步:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 执行
curl -I -v https://mirrors.aliyun.com/composer/packages.json:必须看到HTTP/2 200+Content-Type: application/json - 再执行
curl --noproxy "*" -I https://mirrors.aliyun.com/composer/packages.json:如果这句能通,但上一句失败,就是代理问题实锤 - 若返回
text/html或跳转到https://login.zscloud.net类页面,说明 Zscaler、SonicWall 等企业网关正在拦截
代理配置必须显式清除或重设,NO_PROXY 不生效
Composer 完全忽略系统级 NO_PROXY、no_proxy 环境变量,必须手动干预:
- 彻底禁用代理:
composer config -g http-proxy ""(注意是空字符串,不是null) - 若需局部代理(比如只走公司内网),显式设为:
composer config -g http-proxy "http://127.0.0.1:8888" - 检查是否残留旧配置:
composer config -g --list | grep proxy,确保没有https-proxy或github-protocols干扰
换源 + 清缓存 + 强制重试,三步绕过代理污染
即使代理无法关闭,也能让 Composer 绕过它完成安装:
- 临时指定可信镜像:
composer install -vvv --repository=https://mirrors.huaweicloud.com/repository/php/(注意末尾/) - 清掉被代理污染的缓存:
composer clear-cache,再手动确认~/.composer/cache/repo/https---mirrors-huaweicloud-com-repository-php目录为空 - 加
--retry=3应对瞬时失败:composer install --retry=3 --no-cache --repository=https://mirrors.aliyun.com/composer/
真正难处理的不是代理本身,而是它让 Composer 的行为变成“不可见的 fallback”——你得亲手验证每层响应,否则永远在猜哪一环断了。

















