返回

Guzzle中的CurlMultiHandler多请求日志记录:终极解决方案

php

Guzzle 中 CurlMultiHandler 的多请求日志记录:解决方案

前言

在使用 Guzzle 时,日志记录请求和响应对于调试和分析非常重要。然而,当使用 CurlMultiHandler 并行处理多个请求时,默认的日志记录行为会导致响应信息无效。本文将探讨如何解决此问题,以便从 CurlMultiHandler 获取有效的响应日志。

问题

当 Guzzle 使用 CurlMultiHandler 时,默认的日志记录中间件无法正确获取响应信息。这使得调试和分析并行请求变得困难。

解决方案

要解决此问题,需要自定义日志记录函数,以便在使用 CurlMultiHandler 时处理响应。自定义函数如下:

use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;

$loggerMiddleware = new Logger(function (
    $level,
    $message,
    array $context = []
) {
    // 获取请求和响应对象
    $request = $context['request'] ?? null;
    $response = $context['response'] ?? null;

    // 检查是否为 CurlMultiHandler
    if ($context['handler'] instanceof CurlMultiHandler) {
        // 获取响应信息
        $effectiveUri = $context['curl']['info']['url'];
        $statusCode = $context['curl']['info']['http_code'];
        $contentType = $context['curl']['info']['content_type'];

        // 构建响应对象
        $response = new Response();
        $response->withStatus($statusCode);
        $response->withHeader('Content-Type', $contentType);
        $response->getBody()->write($context['curl']['body']);
    }

    // 记录日志信息
    // ...
});

步骤:

  1. 在自定义日志记录函数中,检查 $context['handler'] 是否是 CurlMultiHandler。
  2. 如果是,则从 $context['curl'] 中提取响应信息。
  3. 构建一个 Response 对象并添加响应信息。
  4. 记录日志信息,包括构建的 Response 对象。

使用示例

将自定义日志记录中间件添加到 Guzzle 客户端堆栈中:

$handler = new CurlMultiHandler();
$stack = HandlerStack::create($handler);
$stack->push($loggerMiddleware);
$client = new Client(['handler' => $stack]);

现在,当使用 Guzzle 客户端进行请求时,自定义日志记录函数将被调用,即使使用的是 CurlMultiHandler,也能记录有效的响应信息。

结论

通过自定义 Guzzle 的日志记录函数,您可以从 CurlMultiHandler 获取响应信息,从而实现对并行处理的多个请求进行有效的日志记录。这对于调试和分析请求和响应行为至关重要。

常见问题解答

  1. 为什么需要自定义日志记录函数?

    • 因为默认的日志记录中间件无法正确处理 CurlMultiHandler 的响应信息。
  2. 自定义日志记录函数的工作原理是什么?

    • 它从 CurlMultiHandler 的上下文对象中提取响应信息并构建一个 Response 对象,然后记录日志信息。
  3. 如何使用自定义日志记录函数?

    • 将它添加到 Guzzle 客户端的处理器堆栈中。
  4. 自定义日志记录函数是否会影响请求性能?

    • 不会,它是一个轻量级函数,不会对请求性能产生明显影响。
  5. 除了请求和响应信息之外,自定义日志记录函数还可以记录哪些其他信息?

    • 您可以在自定义函数中添加任何所需的信息,例如处理时间、请求大小和响应大小。