直接升级 Guzzle 到 7.x/8.x 易破坏调用逻辑,因 v7+ 改为 Promise-first 异步默认、移除 send()、重命名配置项;v8+ 更强制异步且要求 PHP 8.0+,须改用 getAsync() 并处理 Promise。

直接升级 guzzlehttp/guzzle 到 7.x 或 8.x 很可能破坏现有 HTTP 客户端调用逻辑,尤其是你项目里用了 send()、request() 的返回值解构,或手动构造 Request 对象——这些在 v7+ 已彻底重构为 Promise-first + 异步默认行为。
确认当前版本和依赖链
先看清楚你到底被谁拉着不能升:不是你代码直接 require 了 guzzle,而是某个 SDK(比如 aws/aws-sdk-php、spatie/laravel-backup)锁死了旧版。运行:
composer show guzzlehttp/guzzle
再查谁在依赖它:
composer depends guzzlehttp/guzzle
常见情况包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
laravel/frameworkv8 及以下默认拉guzzlehttp/guzzle^6.5,v9+ 才适配 v7+ -
php-http/guzzle6-adapter这类桥接包会硬依赖 v6,删不掉就升不了 - 自定义的
GuzzleHttp\Client子类若重写了send(),v7+ 中该方法已移除,必须改用execute()或requestAsync()
升级到 v7.x 的最小改动路径
v7 是兼容性过渡版,保留同步调用习惯,但底层已基于 PSR-18 和 Promises。关键动作是:
- 执行
composer require guzzlehttp/guzzle:^7.5(别用^7.0,早期 v7 有 stream 资源泄漏 bug) - 把所有
$client->get($url)改成$client->get($url)->getBody()->getContents()—— v7+ 返回ResponseInterface,不再自动解包 body - 检查是否用了
GuzzleHttp\Ring:这个命名空间在 v6 就已废弃,v7 彻底删除,相关 RingPHP 适配器全部失效 - 若用了
curl.options配置项,需改为curl数组键(如['curl' => [CURLOPT_TIMEOUT => 5]]),v7 不再识别旧 key 名
跳过 v7 直升 v8/v9 的硬约束
v8+ 移除了同步阻塞方法,get()、post() 等全部返回 PromiseInterface,且要求 PHP 8.0+(v9 要求 8.1+)。强行升级会立刻报错:
Call to undefined method GuzzleHttp\Client::get()
此时必须:
- 确认项目已启用
async/await支持(即使用ReactPHP、Amp,或 Laravel 的Http::pool()) - 把所有
$client->get(...)替换为await $client->getAsync(...)->then(...)或封装成Promise\Utils::wait()(仅限 CLI / 测试环境,勿用于 Web 请求) - 删除所有对
GuzzleHttp\Handler\CurlMultiHandler的直接引用——v8 改用HandlerStack统一管理,且curl_multi不再暴露为公共类 - 注意
verify默认值从true变为system,若你之前设false绕过证书校验,现在得显式写'verify' => false
最常被忽略的是中间件顺序:v7+ 的 HandlerStack 默认插入了重试、cookie、redirect 中间件,如果你之前靠手工拼 handler 链控制流程,升级后行为会静默变化;建议用 $stack->remove('retry') 显式清理再加回,别依赖默认栈。

















