只配http-proxy一定失败,因composer对http/https请求走独立路由,所有仓库均走https,必须同时配置https-proxy(值须以http://开头)建立connect隧道,缺一则https请求静默直连,导致卡在loading composer repositories或报curl error 28。

代理配置不全或格式错误,是 Composer 拉包失败的主因;离线模式不是开关,而是由 COMPOSER_DISABLE_NETWORK=1 + 显式跳过行为共同触发。
为什么只配 http-proxy 一定失败
Composer 对 HTTP 和 HTTPS 请求走两套独立路由:所有仓库(Packagist、GitHub、GitLab)都走 HTTPS,必须依赖 https-proxy 字段建立 CONNECT 隧道。只设 http-proxy 会导致 HTTPS 请求静默 fallback 到直连,现象是卡在 Loading composer repositories 或反复报 cURL error 28,却无明确错误提示。
-
https-proxy的值协议头必须是http://,哪怕你的代理监听的是 TLS 端口(例如http://127.0.0.1:7890) - 含特殊字符的密码必须 URL 编码,比如
pa@ss/word→pa%40ss%2Fword,可用php -r "echo rawurlencode('pa@ss/word');"生成 - 配置必须加
-g(全局),否则只写入当前项目composer.json,换目录即失效 - 验证是否生效:
composer config -g --list | grep -E "(http|https)-proxy",必须看到两行且格式合规
COMPOSER_DISABLE_NETWORK=1 是离线前提,不是可选项
不设这个环境变量,所有 --no-xxx 参数都无效。它强制 Composer 跳过所有网络请求,包括校验 composer.lock 中 dist 包哈希、读取 provider 分片、触发插件初始化等。但注意:
- 若
composer.lock中某包的dist.url是https://开头,且没配本地path或artifact仓库,COMPOSER_DISABLE_NETWORK=1下会直接退出,不是静默忽略 - 必须配合
--no-plugins --no-scripts --no-autoloader,否则插件(如hirak/prestissimo)或脚本仍可能隐式联网 - 执行完后必须补一记
composer dump-autoload -o,否则运行时大概率报Class not found
离线部署最稳路径:缓存预拉 + 本地解压
比直接复制 vendor/ 更可靠,尤其跨 PHP 小版本或扩展差异场景。核心是让 Composer 从本地缓存读取 zip 包,而非远程下载:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 联网机执行:
composer install --no-install --prefer-dist,所有包会缓存到~/.composer/cache/files/ - 打包缓存:
tar -czf deps.tgz ~/.composer/cache/files/ - 离线机先清空缓存:
composer clear-cache,再解压:tar -xzf deps.tgz -C ~ - 最后运行:
COMPOSER_DISABLE_NETWORK=1 composer install --no-interaction --no-plugins --no-scripts
注意:~/.composer/cache/files/ 下的目录结构是 vendor/name/version-hash/,文件名含哈希,不可手动改名;该方式对 git 源包无效,需提前用 --prefer-dist 强制走 zip。
NTLM 代理或公司内网怎么破
Composer 原生不支持 NTLM 认证,设了 http-proxy 也会直接返回 407 Proxy Authentication Required。必须引入中转代理:
- Windows 推荐
cntlm或px,监听127.0.0.1:3128并处理 NTLM - 然后把 Composer 的
http-proxy和https-proxy都指向http://127.0.0.1:3128 - 验证中转层是否生效:
curl -x http://127.0.0.1:3128 -I https://packagist.org/packages.json,若也报407,说明中转没配好 - 别指望
HTTP_PROXY环境变量——Composer 明确忽略它,只认自己的字段
真正容易被忽略的是:即使代理和离线参数都对了,PHP 的 default_socket_timeout 若低于 http.timeout(常见默认值为 60),底层连接仍会被提前掐断。必须同步检查并调高:php -d default_socket_timeout=1200 composer install。










