guzzle-history-middleware 不是一个独立发布的 composer 包,你搜不到、composer require 会报错。这不是你配置或网络的问题,而是这个“库”只是社区里对某类中间件实现的统称,没有官方维护的包名。

Composer 安装 Guzzle-History-Middleware 失败?它根本不存在
直接说结论:guzzle-history-middleware 不是一个独立发布的 Composer 包,你搜不到、composer require 会报错。这不是你配置或网络的问题,而是这个“库”只是社区里对某类中间件实现的统称,没有官方维护的包名。
用 GuzzleHttp\HandlerStack + ArrayHandler 手动实现历史记录
真正能落地的做法,是利用 Guzzle 自带的 HandlerStack 和一个简单的数组收集器。不需要额外依赖,兼容 Guzzle 7.x(主流版本)。
- 创建一个空数组作为日志容器:
$history = []; - 定义中间件函数,把
$request和$response(或异常)存入该数组 - 用
HandlerStack::create()构建 handler,并通过push()注入中间件 - 构造
HttpClient时传入该 stack
示例关键片段:
$history = [];
$stack = HandlerStack::create();
$stack->push(function ($handler) use ($history) {
return function ($request, $options) use ($handler, $history) {
return $handler($request, $options)
->then(
function ($response) use ($history, $request) {
$history[] = ['request' => $request, 'response' => $response];
return $response;
},
function ($reason) use ($history, $request) {
$history[] = ['request' => $request, 'error' => $reason];
return \GuzzleHttp\Promise\rejection_for($reason);
}
);
};
});
$client = new Client(['handler' => $stack]);
// 发起请求后,$history 就有记录了
为什么不用第三方封装包?
过去有人发布过叫 guzzle-history-middleware 的小包(如 knplabs/guzzle-bundle 里的部分逻辑),但它们要么已废弃,要么绑定特定框架(如 Symfony),要么只支持 Guzzle 6 且不维护。强行安装可能引发:
-
Class not found错误(自动加载失败) - 与
guzzlehttp/guzzle7.x+ 的 Promise/HandlerStack 接口不兼容 - 无法捕获流式响应体或重定向链中的中间响应
自己写几行中间件,反而更可控、易调试、无版本绑架。
记录内容够用吗?要不要序列化或写文件?
上面的 $history 数组里存的是 Request 和 Response 对象——不能直接 var_dump 或 json_encode,会抛出循环引用错误。真要落地日志,得手动提取字段:
- 用
$request->getMethod()、$request->getUri()->__toString() - 用
$response->getStatusCode()、(string) $response->getBody() - 错误时用
$reason->getMessage()或$reason->getHandlerContext() - 写文件建议用
file_put_contents(..., JSON_PRETTY_PRINT),别直接print_r到日志
对象本身留着用于调试没问题,但持久化前必须做脱敏和扁平化——尤其是 Response 的 body 可能含敏感数据,也容易撑爆内存。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











