最直接方式是使用 guzzlehttp\middleware::retry() 创建重试中间件并注入 handlerstack;需自定义 $decider 判定网络异常和5xx/429响应才重试,$delay 实现指数退避,且必须通过 handlerstack 传入 client 而非直接赋值 handler。
用 GuzzleHttp\Client 配置重试中间件最直接的方式
PHP 里 Guzzle 本身不内置重试逻辑,必须靠 RetryMiddleware + HandlerStack 手动组装。官方推荐做法是用 GuzzleHttp\Middleware::retry(),它返回一个可插入的中间件函数。
关键点:不能只改 timeout 或 connect_timeout,那只是单次请求超时控制,和“失败后重试”是两回事。
-
retry中间件需绑定到HandlerStack,再传给Client构造函数 - 重试判定逻辑由回调函数
$decider控制,不是所有 HTTP 状态码都该重试(比如 400、401、403 通常不该重试) - 指数退避由
$delay回调决定,Guzzle 不自动帮你算 2^n * 100ms 这类值,得自己写
$decider 怎么写才不乱重试
默认的 retry 决策函数对网络错误(如连接拒绝、超时)返回 true,但对 5xx 响应默认不重试——这点常被忽略,导致服务端临时 502/503 时没重试就直接报错。
典型安全策略:重试网络异常 + 5xx 响应,跳过 4xx(除 429):