”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 如何监控 Guzzle Http 客户端 – PHP 快速提示

如何监控 Guzzle Http 客户端 – PHP 快速提示

发布于2024-11-08
浏览:951

Guzzle 是一款流行的 PHP HTTP 客户端,可以轻松发送 HTTP 请求和创建 Web 服务库。最流行的 PHP 框架提供了内部 Http Client 服务,它们只是 Guzzle Http Client 的定制实现:

  • Laravel Http 客户端
  • Symfony Http 客户端
  • Laminas(以前的 Zend Framework)Http 客户端

Guzzle 被广泛使用有两个主要原因:

1) 定制化和灵活性

对于设计模式的爱好者来说,Guzzle 是开放的扩展。意味着您可以通过扩展其核心组件(Http Client、Request、Response、Milddeware 等)轻松地在 Guzzle 中实现新功能。

2)对中间件的支持

Guzzle 中间件系统允许开发人员在发送请求之前与请求进行交互,并在处理响应之前与响应进行交互。它可以启用日志记录、身份验证和错误处理等高级功能。

Guzzle HTTP 客户端简介

在本教程中,我将指导您完成创建自定义 Guzzle Http 客户端的过程,以便轻松监控应用程序针对外部服务发出的每个请求。

我还将向您展示如何将此实现注入到 IoC 容器(或服务容器)中,以使此实现在您的整个应用程序中可用。

我们将介绍基础知识、自定义选项,并提供真实的代码示例。

安装Guzzle

确保您已安装 Guzzle。如果没有,请使用 Composer 安装:

composer require guzzlehttp/guzzle

基本定制

让我们首先创建一个基本的自定义 Guzzle Http 客户端:

namespace App\Extensions\Guzzle;

use GuzzleHttp\Client;

class CustomGuzzleClient extends Client 
{
    public function __construct(array $config = []) 
    {
        $config['headers']['Custom-Header'] = 'Custom-Value';
        parent::__construct($config);
    }
}

在此示例中,我们扩展 Guzzle Http Client 类并自定义构造函数,以向该客户端发出的所有请求添加自定义标头。

监控 Guzzle Http 请求

Guzzle提供了运行Http请求的快捷方法:

$client->get('/endpoint');
$client->post('/endpoint');
$client->put('/endpoint');

所有这些方法都使用了内部的通用请求方法。下面的截图取自Guzzle客户端代码:

How to monitor Guzzle Http Client – PHP Fast tips

您可以重写请求方法来自定义应用程序对外部服务发出的 HTTP 调用的管理。

namespace App\Extensions\Guzzle;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;


class CustomGuzzleClient extends Client 
{
    public function request($method, $uri, array $options = []) 
    {
        return inspector()->addSegment(function () use ($method, $uri, $options) {

            return parent::request($method, $uri, $options);

        }, "http", "{$method} {$uri}");
    }
}

在此示例中,我只是在每个请求的事务时间线中添加一个新项目。现在您可以在监控视图中看到 Guzzle 进行的 API 调用:

How to monitor Guzzle Http Client – PHP Fast tips

如果您是 Inspector 新手,您可以按照本教程了解如何入门:

https://inspector.dev/laravel-real-time-performance-monitoring-using-inspector-part-1/

您还可以在回调中注入Segment参数来与项目交互或添加更多信息:

namespace App\Extensions\Guzzle;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use Inspector\Models\Segment;

class CustomGuzzleClient extends Client 
{
    public function request($method, $uri, array $options = []) 
    {
        return inspector()->addSegment(function (Segment $segment) use ($method, $uri, $options) {

            $response = parent::request($method, $uri, $options);
            $segment->label = "{$response->getStatusCode()} {$method} {$uri}";
            return $response;

        }, "http");
    }
}

使用自定义 Http 客户端

现在,您可以在应用程序中使用自定义客户端。由于扩展不会对标准 Guzzle Http 客户端的行为进行任何更改,因此您可以创建自定义类的实例并照常使用它:

// Create an instance of the custom client
$client = new CustomGuzzleClient(['base_uri' => 'https://api.example.com']);

// Make an API request. It will be automatically monitored by Inspector.
$response = $client->get('/endpoint');

将 Guzzle Http Client 绑定到容器中

我将在本示例中使用 Laravel,但基本概念与本文开头提到的最流行的 PHP 框架相同。它们都与服务容器一起使用。

我们为 Guzzle Http Client 类创建一个绑定到容器中的单例。因此,每个请求此类的服务都将收到支持实时监控的自定义客户端实例。

use GuzzleHttp\Client;
use App\Extensions\Guzzle\CustomGuzzleClient;
use Illuminate\Contracts\Foundation\Application;

$this->app->singleton(Client::class, function (Application $app) {
    return new CustomGuzzleClient();
});

现在您可以尝试在 Artisan Command 中注入 Guzzle Http Client 类并运行 Http 调用以进行测试:

namespace App\Console\Commands;


use Illuminate\Console\Command;
use GuzzleHttp\Client;

class TryCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'try';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Test Guzzle Http Client monitoring.';

    /**
     * Inject the Guzzle Http Client class into the constructor.
     * The CustomGuzzleClient will be the concrete class.
     */
    public function __construct(protected Client $client)
    {
        parent::__construct();
    }

    /**
     * Handle the command execution.
     */
    public function handle()
    {
        $this->line($this->description);

        $this->line("Concrete class: ".get_class($this->client));

        $this->client->get('https://google.com');

        return Command::SUCCESS;
    }
}

运行命令以验证 Http 调用是否在事务时间线中可见:

php artisan try

督察新人?免费监控您的应用程序

Inspector是专门为软件开发人员设计的代码执行监控工具。您无需在云基础设施或服务器中安装任何内容,只需安装 Composer 包即可开始使用。

与其他复杂的一体化平台不同,Inspector 非常简单,并且对 PHP 友好。您可以尝试我们的 Laravel 或 Symfony 包。

如果您正在寻找有效的自动化、深入的见解以及将警报和通知转发到您的消息传递环境的能力,请免费尝试 Inspector。注册您的帐户。

或者在网站上了解更多信息:https://inspector.dev

How to monitor Guzzle Http Client – PHP Fast tips

版本声明 本文转载于:https://dev.to/inspector/how-to-monitor-guzzle-http-client-php-fast-tips-4ijg?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Darshan Hiranandani 的解释:如何使用 PHP 连接到 MySQL 数据库?
    Darshan Hiranandani 的解释:如何使用 PHP 连接到 MySQL 数据库?
    大家好,我是 Darshan Hiranandani,我正在解释如何使用 PHP 连接到 MySQL 数据库? 要使用 PHP 连接到 MySQL 数据库,您可以使用 mysqli 扩展或 PDO(PHP 数据对象)扩展。以下是这两种方法的示例: 使用 mysqli 扩展
    编程 发布于2024-11-09
  • 如何掌握 CSS 盒子模型以实现完美的网站布局(+ Codepen 示例)
    如何掌握 CSS 盒子模型以实现完美的网站布局(+ Codepen 示例)
    嘿,了不起的人!欢迎回到我的博客。 ?今天,我们将深入研究 CSS 盒子模型,揭秘如何确定每个元素的大小,以及如何使用这些知识来创建精确、现代和简洁的设计(本文末尾的实际示例)。 盒子模型简介 CSS 盒子模型是网页设计的基础,它规定了每个 HTML 元素如何在网页中占据空间。 盒子...
    编程 发布于2024-11-09
  • 如何在空手道的读取方法中参数化请求文件名?
    如何在空手道的读取方法中参数化请求文件名?
    在Karate的读取方法中参数化请求文件名尝试使用Karate进行自动化API测试时,您可能会在尝试通过时遇到问题将 XML 文件发送到 Read 方法,收到类似于问题中提到的异常。当您在 Read 方法中使用变量表示文件路径(例如 read(varXmlFile))时,会发生这种情况。要解决此问题...
    编程 发布于2024-11-09
  • 如何在 Pandas 中基于 If-Else-Else 条件创建列?
    如何在 Pandas 中基于 If-Else-Else 条件创建列?
    在 Pandas 中使用 If-Else-Else 条件创建列根据 if-elif-else 条件创建新列,有两种主要方法:非向量化方法这种方法涉及定义一个对行进行操作的函数:def f(row): if row['A'] == row['B']: val = 0 e...
    编程 发布于2024-11-09
  • 构建更智能的合约:Go 如何为 KALP Studio 的区块链解决方案提供支持
    构建更智能的合约:Go 如何为 KALP Studio 的区块链解决方案提供支持
    随着区块链革命的蓬勃发展,开发智能合约对于利用区块链技术变得至关重要。智能合约本质上是去中心化应用程序 (dApp) 的支柱,有助于在没有中介的情况下促进、验证或执行协议。随着各种编程语言在智能合约开发中越来越受欢迎,Go(或 Golang) 越来越受欢迎。在这篇博客中,我们将深入探讨为什么 KAL...
    编程 发布于2024-11-09
  • 在 Android 中实现 CheckBox Listener 时如何修复 Eclipse 错误?
    在 Android 中实现 CheckBox Listener 时如何修复 Eclipse 错误?
    Android CheckBox Listener:解决 Eclipse 错误尝试在 Android 中实现 CheckBox 的侦听器时,开发人员在使用时可能会遇到错误默认的 OnCheckedChangeListener 类。 Eclipse 可能会将其识别为 RadioGroup 的实例,从而...
    编程 发布于2024-11-09
  • 如何在 Linux 中使用“cpuid”指令访问 CPU 信息?
    如何在 Linux 中使用“cpuid”指令访问 CPU 信息?
    在 Linux 上使用 cpuid 指令访问 CPU 信息在这个问题中,开发人员试图在 Linux 环境中使用方法类似于 Windows API 中的 _cpuinfo() 函数。提供的代码尝试利用汇编指令 (cpuid) 来检索此信息,但开发人员希望避免手动汇编的需要。解决方案在于利用编译代码时可...
    编程 发布于2024-11-09
  • 如何确定 JavaScript 字符串的字节大小
    如何确定 JavaScript 字符串的字节大小
    确定 JavaScript 字符串的字节大小在 JavaScript 中,字符串使用 Unicode 字符编码标准(称为 UCS-2)表示。这意味着字符串中的每个字符通常由两个字节表示。但是,字符串的实际字节大小可能会有所不同,具体取决于传输过程中使用的字符串编码(例如 UTF-8)和特定浏览器实现...
    编程 发布于2024-11-09
  • JavaScript 记忆
    JavaScript 记忆
    JavaScript 是一种功能强大的编程语言,在开发交互式网站方面发挥着重要作用。然而,在处理复杂和数据密集型应用程序时,JavaScript 性能可能会成为一个问题。这就是记忆发挥作用的地方。通过释放缓存的力量,记忆化是一种可以显着提高 JavaScript 性能的技术,使您的应用程序运行得更快...
    编程 发布于2024-11-09
  • 如何在 Linux 系统中使用 Python 创建预填充输入函数?
    如何在 Linux 系统中使用 Python 创建预填充输入函数?
    Python 中的输入编辑Python 的 input() 和 raw_input() 函数本身不允许预填充输入编辑。然而,在Linux系统中,readline模块可以用来创建提供此功能的rlinput函数。rlinput函数有两个参数:prompt:显示的提示符给用户。prefill:在输入字段中...
    编程 发布于2024-11-09
  • 如何在 Java 中检索文件创建日期?
    如何在 Java 中检索文件创建日期?
    在 Java 中检索文件创建日期确定文件创建日期对于组织和管理文件至关重要,特别是在需要按时间顺序排序时。在 Java 中,有一个利用 Java NIO 库的解决方案。NIO(新输入/输出)提供了检索文件元数据(包括创建日期)的方法。仅当底层文件系统支持时才能访问此元数据。要使用 NIO 访问文件创...
    编程 发布于2024-11-09
  • 如何用 Python 构建 Hangman 游戏:分步指南
    如何用 Python 构建 Hangman 游戏:分步指南
    Hangman 是一款经典的猜词游戏,非常有趣,对于初学者程序员来说是一个很棒的项目。 在本文中,我们将学习如何用 Python 构建一个简单版本的 Hangman 游戏。 最后,您将了解如何使用 Python 的基本控制结构、函数和列表来创建这个游戏。 什么是刽子手? Hang...
    编程 发布于2024-11-09
  • 了解序列化和反序列化:方法、示例和最佳实践
    了解序列化和反序列化:方法、示例和最佳实践
    1.什么是序列化和反序列化? 序列化和反序列化是将复杂的数据结构转换为易于存储或传输并随后重建的格式的过程。 1.1 序列化 序列化是将对象或数据结构转换为易于存储(例如,在文件或数据库中)或传输(例如,通过网络)的格式的过程。这种格式通常是字节流或文本格式,例如...
    编程 发布于2024-11-09
  • 根据创建日期向 MySQL 表添加序列号:分步指南
    根据创建日期向 MySQL 表添加序列号:分步指南
    随着数据库的增长和发展,我们经常发现自己需要添加新列或修改现有结构。一种常见的场景是需要向现有表添加序列 ID,特别是当我们希望该 ID 反映记录创建的时间顺序时。在这篇博文中,我们将逐步介绍向 MySQL 表添加自动递增序列 ID 的过程,该序列按创建日期列排序。 问题 假设您的 ...
    编程 发布于2024-11-09
  • Angular 基础知识:理解 TypeScript
    Angular 基础知识:理解 TypeScript
    Angular 构建于 TypeScript 之上,它是 JavaScript 的超集,引入了类型安全,使开发人员能够在开发过程中而不是在运行时捕获潜在的错误。对于熟悉 TypeScript 的开发人员来说,这将是一个熟悉的场景,但如果您是 TypeScript 的新手,让我们回顾一下它的一些关键功...
    编程 发布于2024-11-09

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3