# Guzzle 8.0.0 正式发布:PHP主流HTTP客户端重大破坏性版本升级
Guzzle 8.0.0 重磅破坏性版本正式发布,本次更新以**类型安全、安全加固、协议升级**为核心,底层依赖同步升级:`guzzlehttp/promises ^3.0`、`guzzlehttp/psr7 ^3.0`。
本文梳理新增特性、行为变更、废弃移除接口,并整理项目升级排查要点,方便开发者评估迁移成本。
一、核心新增功能
1. 协议与传输能力升级
- **HTTP/3 原生支持**:PHP 8.4+ 搭配支持QUIC的libcurl,内置cURL处理器可直接发起HTTP/3请求;
- 多路复用扩展:新增 `Multiplexing::NONE` 禁用模式,客户端、cURL多句柄、请求选项三层均可独立配置;
- 持久化传输策略:新增两种连接共享模式
- `PERSISTENT_PREFER`:优先复用连接
- `PERSISTENT_REQUIRE`:强制复用连接
- PSR-17 工厂注入:新增 `request_factory/response_factory/stream_factory/uri_factory` 请求选项,支持自定义PSR-17工厂实例。
2. 异常体系全面细化(重点影响异常捕获逻辑)
拆分原有笼统异常类型,错误定位更加精准:
- `ConnectTimeoutException`:连接阶段超时(继承 `ConnectException`)
- `NetworkException`:底层无响应网络故障
- `NetworkTimeoutException`:传输层空闲超时
- `ResponseTransferException`:响应传输异常,子类 `ResponseTimeoutException` 对应响应读取阶段超时
- `ResponseException`:存在响应体的请求失败异常
- `HandlerClosedException`:cURL多句柄关闭,待处理请求被拒绝时抛出
3. 安全与调试优化
- 全部凭证参数标记 `#[\SensitiveParameter]`,PHP 8.2+ 堆栈自动脱敏,杜绝日志密钥泄露;
- 新增 `ProxyOptions` 统一管理代理配置解析;
- `FileCookieJar` 安全加固:切换JSON存储、文件权限限制仅所有者可读、移除PHP反序列化逻辑;
- 内置 Basic / Digest 认证中间件,替代零散旧认证实现。
4. 其他新增能力
- cURL处理器、Curl工厂新增显式 `close()` 生命周期方法;
- 全量补充泛型PHPDoc注解,提升IDE智能提示与静态代码分析效果;
- 连接池Pool回调支持传递迭代器key参数;
- 源码全局启用 `declare(strict_types=1)`,强化全局类型一致性。
二、核心行为变更(兼容性风险点)
1. 类型安全全面收紧
所有请求选项增加前置强类型校验,非法参数直接抛出异常,不再静默兼容:
代理、超时、协议版本、延迟时间、查询参数、请求体等参数均增加类型、合法范围校验;
`SetCookie` 类全部方法与公开属性增加原生类型声明。
2. Cookie 严格对齐 RFC 6265
- Cookie 名称区分大小写;优先读取 `Max-Age`,优先级高于 `Expires`;
- 强制校验 `__Secure-` / `__Host-` 前缀Cookie规范,非HTTPS连接拒绝接收Secure Cookie;
- 优化IPv6主机域名匹配逻辑,收紧域名后缀匹配规则;
- 无 `Domain` 属性的响应Cookie,仅在当前主机生效。
3. 代理逻辑统一
- 流处理器、cURL处理器读取 `no_proxy/NO_PROXY` 环境变量逻辑完全一致;
- 不带端口代理地址默认使用 `1080`;非法代理URL提前校验直接报错;
- 环境变量代理不支持HTTP/3时,自动降级 HTTP/2 / HTTP/1.1。
4. 重定向 & 超时默认参数调整
- 仅自动跟随标准状态码:`301/302/303/307/308`;
- 跨域重定向:Referer仅保留源站信息,不再转发认证凭证;
- 流处理器区分双超时:`timeout` 总截止时间、`read_timeout` 空闲超时,默认60s;
- cURL连接超时默认60秒,不再依赖PHP `default_socket_timeout`;
- 所有HTTPS请求强制最低 TLS 1.2;
- HTTP/2多路复用默认 `Multiplexing::WAIT`,等待连接就绪再发送请求。
5. 认证逻辑调整
- Basic认证用户名禁止包含冒号;凭证禁止携带ASCII控制字符;
- Digest认证优化:预授权无正文请求可复用已验证挑战,修复nonce计数;
- 取消NTLM一等原生支持。
三、破坏性移除项(升级必核查)
1. PHP版本与依赖约束升级
- 不再支持 PHP 7.2、PHP 7.3;最低要求PHP 7.4+
- `guzzlehttp/promises` 要求 `^3.0`
- `guzzlehttp/psr7` 要求 `^3.0`
2. 接口、方法废弃删除
- 移除 `Client::__call()` 魔术方法,必须显式调用 `get()/post()` 或 `request()/requestAsync()`;
- `ClientInterface::getConfig()` 被移除,仅实体 `Client` 保留;
- 删除 `handler` 请求选项,处理器必须在实例化客户端时配置;
- 移除环境变量 `GUZZLE_CURL_SELECT_TIMEOUT`,改用 `CurlMultiHandler` 构造参数 `select_timeout`;
- 禁止直接访问 `CurlMultiHandler::$_mh` cURL资源句柄;
- 清理废弃静态工具方法:
`Utils::jsonEncode()/jsonDecode()`、`RetryMiddleware::exponentialDelay()`、`RequestException::wrapException()`、`Utils::isHostInNoProxy()`; - `RequestException` 不再支持获取响应,存在响应场景统一捕获 `ResponseException`。
四、项目升级提示
- 典型大版本不兼容更新,升级前全面扫描:自定义中间件、异常捕获、废弃API调用;
- 项目如果锁定 `psr7:2.x`、`promises:2.x`,需要同步升级配套依赖;
- 业务代码中通过 `RequestException` 获取响应的逻辑,重构切换至 `ResponseException`;
- 自研Cookie处理、代理规则、重定向拦截逻辑需要回归测试,规范校验更加严格;
- 依赖Guzzle7的第三方SDK不要盲目升级,等待上游官方适配Guzzle 8。
结语
Guzzle 8.0 从底层收紧类型约束、网络协议规范,重构异常、传输、认证模块,安全性与标准化程度大幅提升,但存在大量破坏性改动。
升级务必同步更新配套依赖,重点改造异常捕获、Cookie、代理相关业务代码;第三方组件未适配环境下暂缓迁移,逐条验证网络请求逻辑,避免线上故障。