composer config -g http-proxy 没生效是因为仅写入当前用户配置文件,而 PHP-FPM 或 CI 以 www-data 等用户运行,读不到该路径;需用对应用户配置(如 sudo -u www-data composer config -g http-proxy ...)或改用 /etc/composer/config.json,并须同时配置 https-proxy(值必须为 http:// 开头),且注意环境变量(如 HTTPS_PROXY)优先级更高,会覆盖 config 设置。

composer config -g http-proxy 为什么没生效
因为 composer config -g 只写进当前用户的 ~/.composer/config.json,而 PHP-FPM 或 CI 环境常以 www-data、jenkins 等非登录用户运行,根本读不到你的家目录配置。运行 whoami 和 composer config -g --global-config 就能立刻确认它到底在读哪个文件。
常见错误现象:curl: (7) Failed to connect 或 Connection refused,但你明明配了代理——其实 Composer 根本没加载那行配置。
- 用实际执行用户配置:比如 PHP-FPM 是
www-data,就该运行sudo -u www-data composer config -g http-proxy http://127.0.0.1:8888 - 或改用系统级配置(Composer 2.2+):直接写
/etc/composer/config.json,所有用户统一读取,不依赖 home 目录 - 验证是否加载:运行
sudo -u www-data composer config http-proxy,有输出才说明真生效
http-proxy 和 https-proxy 必须分开配
http-proxy 不会自动用于 HTTPS 请求,https-proxy 字段必须显式设置,否则走 HTTPS 的包(比如访问 https://mirrors.aliyun.com/composer/)仍会直连失败。
错误写法:composer config -g http-proxy http://127.0.0.1:8888 —— 这只影响 HTTP 源,对绝大多数镜像无效。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确做法是两条都设:
composer config -g http-proxy http://127.0.0.1:8888和composer config -g https-proxy http://127.0.0.1:8888 - 如果代理服务本身只监听 HTTP(如 Squid 默认),
https-proxy值也得用http://开头,不是https:// - 值为空或拼写错误(如写成
https_prox)时,Composer 静默忽略,不会报错
环境变量比 config 配置优先级更高
HTTP_PROXY 和 HTTPS_PROXY 环境变量启动时就被 OpenSSL 和 cURL 读取,Composer 完全绕过自己的 config.json,直接走系统代理层。这意味着它们会覆盖掉所有 composer config 设置。
典型踩坑场景:CI 脚本里先 export HTTPS_PROXY=...,再跑 composer install,结果发现 composer config https-proxy 输出为空,但代理却在工作——其实是环境变量在起作用。
- 临时禁用:命令前加
HTTPS_PROXY= composer install(注意等号后无空格无值) - 确认是否被环境变量干扰:运行
env | grep -i proxy,看有没有残留的http_proxy、HTTP_PROXY、no_proxy等 -
no_proxy必须小写且逗号分隔,如no_proxy=localhost,127.0.0.1,.internal.example.com;写成大写或空格分隔会被忽略
代理配置和 SSL 证书冲突最隐蔽
即使代理通了,file_get_contents(): SSL operation failed 或 curl: (60) SSL certificate problem 仍可能报错——问题不在代理,而在 SSL_CERT_FILE 指向了一个损坏或过期的证书文件,导致代理转发后的 HTTPS 握手失败。
这个错误和镜像、代理配置完全无关,但现象高度相似:所有 composer install 请求都卡在 TLS 层。
- 检查命令:
echo $SSL_CERT_FILE+ls -l $(echo $SSL_CERT_FILE),确认路径存在且可读 - 临时清除:
SSL_CERT_FILE= composer install(注意等号后为空) - 别把
SSL_CERT_FILE指向目录,它只接受单个 PEM 文件;目录请用SSL_CERT_DIR - PHP CLI 实际加载的
openssl.cafile可通过php -r "print_r(openssl_get_cert_locations());"查看,和 Apache 的 php.ini 不是一回事

















