“Connection refused”或“cURL error 7”是系统级连接被拦截,主因是企业防火墙/TLS中间人代理在握手阶段主动RST,需降级TLS 1.2、禁用HTTP/2、严格校验镜像配置(repo.packagist、type composer、URL末尾带/)、清缓存并确认运行用户权限。

Composer 报 Connection refused 或 cURL error 7 是防火墙在拦截
不是 Composer 坏了,也不是镜像地址失效,而是企业防火墙或中间人代理在 TLS 握手阶段就主动 RST(重置连接)。典型现象是:Connection refused、cURL error 7、Connection reset by peer,但 ping 和浏览器打开镜像首页都正常。
根本原因:防火墙识别出 User-Agent: Composer/2.x 或对 ALPN 协商(如 HTTP/2)不兼容,直接中断连接;部分设备还会劫持 HTTPS 流量并替换证书,导致 OpenSSL 校验失败后静默断连。
- 先验证是否真被拦截:运行
php -r "echo file_get_contents('https://mirrors.aliyun.com/composer/');",如果报Connection reset by peer,基本可确认是 TLS 层被截断 - 别信浏览器能开就等于 Composer 能通——浏览器走的是系统证书信任链,而 PHP 的 OpenSSL 只认自己配置的
cafile - 临时关闭杀毒软件(如火绒、360)再试,它们常静默劫持 HTTPS 流量
强制降级 TLS 并禁用 HTTP/2 才能绕过拦截
企业网关普遍不支持 HTTP/2 或 ALPN,Composer 默认启用 HTTP/2 + TLS 1.3,容易触发拦截。必须降级到更“老旧”但兼容性更强的组合。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 让 PHP curl 使用 TLS 1.2:在命令前加环境变量
PHP_CURL_SSL_VERSION=TLSv1_2,例如:PHP_CURL_SSL_VERSION=TLSv1_2 composer install - 禁用 HTTP/2:设置
composer config -g http.version 1.1(注意是http.version,不是http-version) - 若仍失败,加
-d openssl.cafile=/path/to/cacert.pem指定权威 PEM 文件(推荐用 curl 官方 PEM),避免本地 CA 陈旧引发二次校验失败
镜像配置写错一个字符就等于没配
防火墙环境下,错误配置会让 Composer 静默 fallback 到官方源,然后卡在 packagist.org 的证书或连接上——你以为连的是阿里云,其实连的是被拦截的官方站。
- 键名必须是
repo.packagist(单数repo,不是repos或packagist.org) - type 值必须显式写
composer,漏掉就会走默认逻辑:composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ - URL 必须以
/结尾:https://mirrors.aliyun.com/composer/✅,https://mirrors.aliyun.com/composer❌(少斜杠会拼成/composerpackages.json导致 404) - 验证是否生效:
composer config -g repo.packagist输出必须是完整 JSON:{"type": "composer", "url": "https://mirrors.aliyun.com/composer/"}
CI/CD 或宝塔里换源后依然失败,本质是用户权限隔离
全局配置写在当前用户的 ~/.composer/config.json,但 CI runner、宝塔的 www 用户、Docker 容器里的非 root 用户根本读不到这个文件。
- 宝塔终端先执行
whoami确认实际运行用户(通常是www),再用sudo -u www composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/重配 - CI 脚本开头必须固化环境:
export COMPOSER_HOME=/tmp/composer,否则每次构建都从空配置开始 - 某些环境默认走 IPv6,而国内镜像对 IPv6 支持不全,加
COMPOSER_IPV4=1强制走 IPv4
最易忽略的是:换源后不 composer clear-cache,旧的失败响应(比如 timeout、503)还在缓存里,重试时照样失败。

















