必须同时设置http-proxy和https-proxy,且https-proxy值必须以http://开头;仅配http-proxy会导致HTTPS请求静默失败,现象为卡在“Loading composer repositories”并超时或502。

composer config -g https-proxy 必须显式设置
只配 http-proxy 会静默失败——Packagist 全量走 HTTPS,而 http-proxy 对 HTTPS 请求完全无效。Composer 不会自动 fallback 或报错,现象是卡在 Loading composer repositories,超时或 502。
必须同时设置两个字段,且 https-proxy 的值必须是 http:// 协议开头(哪怕代理本身监听 TLS 端口):
composer config -g http-proxy http://user:pass@127.0.0.1:8080composer config -g https-proxy http://user:pass@127.0.0.1:8080
密码含 @、/、: 要 URL 编码,例如 pa@ss/word → pa%40ss%2Fword,可用 php -r "echo rawurlencode('pa@ss/word');" 快速生成。
自定义脚本里不能依赖环境变量传代理配置
Composer 不读取系统 HTTP_PROXY 或 HTTPS_PROXY 环境变量,脚本里用 getenv() 拿不到有效值。想让脚本自动适配代理,得手动从 Composer 配置里读:
- 用
composer config --global http-proxy和composer config --global https-proxy获取当前值 - 在 PHP 脚本中执行 shell 命令并解析输出,或直接读取
$HOME/.composer/config.json(注意 Windows 是%APPDATA%\Composer\config.json) - 别硬编码代理地址——不同开发者、CI 环境可能用不同代理或无代理
示例片段(PHP 脚本开头):
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
$config = json_decode(file_get_contents(__DIR__ . '/../../.composer/config.json'), true);
$proxy = $config['config']['https-proxy'] ?? null;
if ($proxy) {
putenv("HTTPS_PROXY=$proxy");
putenv("HTTP_PROXY=$proxy");
}
@php scripts/proxy-check.php 中的路径和加载器要写死
脚本声明为 "proxy:check": "@php scripts/proxy-check.php" 时,scripts/proxy-check.php 必须真实存在,且开头必须显式引入自动加载器:
-
require __DIR__ . '/vendor/autoload.php';—— 绝对路径,不依赖当前工作目录 - 别写
include 'vendor/autoload.php',composer run可能在任意目录触发 - Windows 下用
@php,不用php.exe;Linux/macOS 也统一用@php,避免多 PHP 版本冲突 - 路径一律相对项目根目录,比如
./scripts/proxy-check.php,不写scripts/proxy-check.php(缺少./在某些 Shell 下会失败)
NTLM 代理必须用中转工具,脚本里没法绕过
公司内网常用 NTLM 认证代理(如 Windows 域环境),Composer 原生不支持。设了 http-proxy 也会返回 407 Proxy Authentication Required 或连接失败。
唯一可行方案是本地起中转代理:
- 用
cntlm或px监听127.0.0.1:3128,它处理 NTLM 认证 - 再让 Composer 走这个本地地址:
composer config -g https-proxy http://127.0.0.1:3128 - 脚本里检测代理是否生效,可跑
curl -x http://127.0.0.1:3128 -I https://packagist.org/packages.json,看是否返回 200
别指望 PHP 脚本里调用 stream_context_set_default() 或改 php.ini 来解决——Composer 的网络层不走 PHP 的 stream context。
代理配置和脚本执行是两层事:前者决定 Composer 自身能否联网,后者决定脚本能否复用该网络环境。最容易被忽略的是 https-proxy 的协议头必须是 http://,以及脚本里无法绕过 NTLM 限制——这两点一旦出错,没有任何错误提示,只有无限等待。

















