Guzzle — это популярный HTTP-клиент PHP, который позволяет легко отправлять HTTP-запросы и создавать библиотеки веб-сервисов. Самые популярные PHP-фреймворки предоставляют внутреннюю службу Http-клиента и представляют собой просто настроенную реализацию Http-клиента Guzzle:
Guzzle широко используется по двум основным причинам:
Для любителей шаблонов проектирования Guzzle открыт для расширений. Означает, что вы можете легко реализовать новые функции в Guzzle, расширив его основные компоненты (Http-клиент, запрос, ответ, Milddeware и т. д.).
Система промежуточного программного обеспечения Guzzle позволяет разработчикам взаимодействовать с запросом до его отправки и ответом до его обработки. Он может включать расширенные функции, такие как ведение журнала, аутентификация и обработка ошибок.
В этом уроке я проведу вас через процесс создания собственного Http-клиента Guzzle, чтобы упростить мониторинг каждого запроса, сделанного из вашего приложения, к внешним сервисам.
Я также покажу вам, как внедрить эту реализацию в контейнер IoC (или контейнер служб), чтобы сделать эту реализацию доступной во всем вашем приложении.
Мы рассмотрим основы, варианты настройки и предоставим реальные примеры кода.
Убедитесь, что у вас установлен Guzzle. Если нет, установите его с помощью Composer:
composer require guzzlehttp/guzzle
Давайте начнем с создания базового пользовательского Http-клиента Guzzle:
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); } }
В этом примере мы расширяем класс Http-клиента Guzzle и настраиваем конструктор так, чтобы он добавлял собственный заголовок ко всем запросам, сделанным этим клиентом.
Guzzle предоставляет ярлыки для запуска HTTP-запросов:
$client->get('/endpoint'); $client->post('/endpoint'); $client->put('/endpoint');
Все эти методы используют внутри общий метод запроса. Снимок экрана ниже был взят из кода клиента Guzzle:
Вы можете переопределить метод запроса, чтобы настроить управление 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}"); } }
В этом примере я просто добавляю новый элемент на временную шкалу транзакции для каждого запроса. Теперь вы можете видеть вызовы API, сделанные Guzzle, в представлении мониторинга:
Если вы новичок в 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, вы можете создать экземпляр собственного класса и использовать его как обычно:
// 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');
В этом примере я собираюсь использовать 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(); });
Теперь вы можете попробовать внедрить класс Http-клиента Guzzle в команду Artisan и запустить 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 очень прост и дружелюбен к PHP. Вы можете попробовать наш пакет Laravel или Symfony.
Если вам нужна эффективная автоматизация, глубокая аналитика и возможность пересылать оповещения и уведомления в вашу среду обмена сообщениями, попробуйте Inspector бесплатно. Зарегистрируйте свой аккаунт.
Или узнайте больше на сайте: https://inspector.dev
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3