」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 如何監控 Guzzle Http 用戶端 – PHP 快速提示

如何監控 Guzzle Http 用戶端 – PHP 快速提示

發佈於2024-11-08
瀏覽:610

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]刪除
最新教學 更多>
  • 如何阻止子元素繼承父元素的CSS模糊效果?
    如何阻止子元素繼承父元素的CSS模糊效果?
    CSS Blur問題:在使用CSS將模糊過濾器應用於父元素上時,將子元素從父級的模糊效果實現這一目標,在父級div中創建兩個嵌套的divs:一個用於背景,另一個用於內容。分配“位置:相對”與父級和“位置:絕對; top:0px;右:0px; bottom:0px; left:0px;” (或將高...
    程式設計 發佈於2025-04-14
  • 如何使用Regex在PHP中有效地提取括號內的文本
    如何使用Regex在PHP中有效地提取括號內的文本
    php:在括號內提取文本在處理括號內的文本時,找到最有效的解決方案是必不可少的。一種方法是利用PHP的字符串操作函數,如下所示: 作為替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式來搜索特...
    程式設計 發佈於2025-04-14
  • 使用jQuery如何有效修改":after"偽元素的CSS屬性?
    使用jQuery如何有效修改":after"偽元素的CSS屬性?
    在jquery中了解偽元素的限制:訪問“ selector 嘗試修改“:”選擇器的CSS屬性時,您可能會遇到困難。 This is because pseudo-elements are not part of the DOM (Document Object Model) and are th...
    程式設計 發佈於2025-04-14
  • 為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    為什麼我在Silverlight Linq查詢中獲得“無法找到查詢模式的實現”錯誤?
    查詢模式實現缺失:解決“無法找到”錯誤在銀光應用程序中,嘗試使用LINQ建立錯誤的數據庫連接的嘗試,無法找到以查詢模式的實現。 ”當省略LINQ名稱空間或查詢類型缺少IEnumerable 實現時,通常會發生此錯誤。 解決問題來驗證該類型的質量是至關重要的。在此特定實例中,tblpersoon可能...
    程式設計 發佈於2025-04-14
  • 處理正則表達式中可選空白以精準提取數據
    處理正則表達式中可選空白以精準提取數據
    可選的whitespace regex:忽略屬性值中的空格在編程中,您需要在某些情況下處理字段中包含可選的whiteption whitespaces。當編寫正則表達式以準確提取數據時,這可能是具有挑戰性的。 考慮以下代碼:; 此代碼從HTML標記中提取圖像的SRC屬性。但是,它無法處理某些屬性之...
    程式設計 發佈於2025-04-14
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-04-14
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-04-14
  • 如何有效地選擇熊貓數據框中的列?
    如何有效地選擇熊貓數據框中的列?
    在處理數據操作任務時,在Pandas DataFrames 中選擇列時,選擇特定列的必要條件是必要的。在Pandas中,選擇列的各種選項。 選項1:使用列名 如果已知列索引,請使用ILOC函數選擇它們。請注意,python索引基於零。 df1 = df.iloc [:,0:2]#使用索引0和1 ...
    程式設計 發佈於2025-04-14
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-04-14
  • Java與C#中何時使用`==`與`Equals()`進行 equality 比較?
    Java與C#中何時使用`==`與`Equals()`進行 equality 比較?
    在Java和C#中進行等式比較的操作符:等效VS. == 在Java和c#, == 執行參考等效性,這確定兩個引用是否指向內存中的同一對象。但是,是一種通常比較值,無視對象引用的方法。 在C#中存在一個微小的變化,其中運算符超載允許自定義平等比較。如果為要比較的變量類型定義了過載,則它將覆蓋默認...
    程式設計 發佈於2025-04-14
  • Java中生成特定範圍內的隨機整數和雙精度數方法
    Java中生成特定範圍內的隨機整數和雙精度數方法
    的意圖在三個和五此方法計算可能的值範圍,將其乘以Math.random(),並添加最小值以確保包容性。 如果max大於max,則更新的方法是:的double隨機數生成的擴展,可以使用類似的方法來生成隨機的雙重精神數字:[&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-04-14
  • 如何使用Python有效地以相反順序讀取大型文件?
    如何使用Python有效地以相反順序讀取大型文件?
    在python 中,如果您使用一個大文件,並且需要從最後一行讀取其內容,則在第一行到第一行,Python的內置功能可能不合適。這是解決此任務的有效解決方案:反向行讀取器生成器 == ord('\ n'): 緩衝區=緩衝區[:-1] ...
    程式設計 發佈於2025-04-14
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-04-14
  • 哪種在JavaScript中聲明多個變量的方法更可維護?
    哪種在JavaScript中聲明多個變量的方法更可維護?
    在JavaScript中聲明多個變量:探索兩個方法在JavaScript中,開發人員經常遇到需要聲明多個變量的需要。對此的兩種常見方法是:在單獨的行上聲明每個變量: 當涉及性能時,這兩種方法本質上都是等效的。但是,可維護性可能會有所不同。 第一個方法被認為更易於維護。每個聲明都是其自己的語句,使...
    程式設計 發佈於2025-04-14

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3