composer配置代理必须同时设置http-proxy和https-proxy,且二者均须以http://开头;仅配http-proxy会导致https请求直连失败,卡在“loading composer repositories”。

composer config -g http-proxy 配置代理必须用 http:// 协议
Composer 不支持 https:// 开头的代理地址,哪怕你公司代理本身走 HTTPS。命令里写成 https://10.1.1.100:8080 会静默失败,composer diagnose 也看不到代理生效。必须统一用 http:// 前缀,例如:composer config -g http-proxy http://10.1.1.100:8080。
如果代理需要认证,格式是 http://user:pass@10.1.1.100:8080;密码含 @、/ 等字符时,得 URL 编码(比如 P@ssw0rd → P%40ssw0rd)。
常见翻车点:
-
https-proxy参数不是必须项,别硬配——Composer 会自动把 HTTPS 请求转给http-proxy地址 - 运维给的地址带
https://前缀,直接复制粘贴就废了 - 漏端口(如
http://10.1.1.100),实际代理监听在:8080,结果连接被拒绝
内网没代理时,别试 config -g repo.packagist
完全断网环境下,composer config -g repo.packagist 这类镜像配置毫无意义——它只是换了个域名去请求元数据,但底层还是得连外网。执行后照样卡在 Could not fetch https://packagist.org/packages.json 或超时。
真断网,唯一靠谱路径是 artifact 源:
- 在外网机器上跑
composer install --no-dev --prefer-dist,触发所有 ZIP 包下载到~/.composer/cache/files/ - 把整个
files/目录拷进内网,在项目根目录建artifacts/文件夹,放进去 - 改
composer.json,加"repositories": [{"type": "artifact", "url": "./artifacts"}]
注意:vendor/ 目录不能直接复制,composer.lock 里的 SHA256 校验和会不匹配,安装直接中断。
同时配镜像和代理?先确认哪个路径生效
如果内网能连代理,又想加速下载(比如代理出口慢、但镜像源快),理论上可以叠加:全局配 http-proxy + 项目级配 repositories。但要注意优先级:
-
http-proxy是底层网络通道,所有 HTTP 请求(包括访问镜像源)都走它 -
repositories只改请求目标 URL,不绕过代理 - 所以最终效果 = “代理转发到镜像源”,不是“直连镜像源”
验证是否真走镜像:执行 composer require monolog/monolog -vvv,看日志里 GET 请求的 host 是不是你配的镜像域名(如 mirrors.aliyun.com),而不是 packagist.org。
为什么 -vvv 日志里还出现 packagist.org?
即使你配了镜像,composer update 仍可能请求 packagist.org,原因不是配置失效,而是依赖解析阶段行为:
- 镜像只加速包下载和元数据拉取,不参与依赖解算逻辑
- 当
composer.json里有"php": "^7.4 || ^8.0"这种宽泛约束,Composer 会回溯查旧版本,部分历史版本元数据未被镜像同步,fallback 到官方源 -
require-dev中未锁定版本的包(如"phpunit/phpunit": "^9")也会触发额外探测
这时候卡在 Resolving dependencies,跟镜像或代理无关,得收紧版本约束、删掉不用的 dev 包,而不是反复调配置。
真正卡住时,先 ping mirrors.aliyun.com 和 curl -I https://mirrors.aliyun.com/composer/packages.json 看通不通——底层网络链路断了,再怎么配 Composer 都白搭。











