Отпечатки запросов и как их использовать в Laravel

Источник: «Request fingerprints and how to use them in Laravel»
Отпечаток — уникальный узор или характеристика, которая может быть использована для идентификации человека или объекта. Это понятие широко используется в различных областях.

Например, для уникальной идентификации человека используются уникальные узоры из гребней и впадин на поверхности человеческих пальцев или последовательности ДНК.

Аналогично, в веб-приложениях уникальные шаблоны HTTP-запросов пользователя могут быть использованы для его однозначной идентификации.

Отпечаток запроса может быть сформирован путём хэширования различных значений запроса, таких как URL, IP-адрес, пользовательский агент и другие параметры. Хешированные значения могут быть использованы для идентификации веб-запроса.

Это может быть востребовано в различных сценариях, например:

Итак, давайте разберёмся, как можно использовать отпечатки в Laravel.

Отпечаток запроса в Laravel

Laravel поставляется со встроенным, но недокументированным методом fingerprint, который можно использовать для генерации уникального идентификатора для запроса.

$fingerprint = request()->fingerprint();

// cf3fcc20ae756f4d5a3e1f48a91e722ed93345ca

Вот как выглядит определение метода fingerprint в исходном коде Laravel.

/**
* Get a unique fingerprint for the request / route / IP address.
*
* @return string
*
* @throws \RuntimeException
*/

public function fingerprint()
{
if (! $route = $this->route()) {
throw new RuntimeException('Unable to generate fingerprint. Route unavailable.');
}

return sha1(implode('|', array_merge(
$route->methods(),
[$route->getDomain(), $route->uri(), $this->ip()]
)));
}

Как видите, метод использует такие параметры, как IP-адрес запроса, домен маршрута и URI маршрута, чтобы создать уникальный идентификатор для запроса. Таким образом, отпечаток для запроса будет уникальным для каждого запроса, независимо от параметров или заголовков, отправленных вместе с запросом.

Использование отпечатков запросов

Сгенерированный отпечаток можно использовать как часть ключа кэша, обеспечив уникальность записей кэша для каждого запроса, если хотите кэшировать ответ.

$fingerprint = request()->fingerprint();

$cacheKey = 'response_' . $fingerprint;
$response = Cache::remember($cacheKey, 60, function () {
// Генерация ответа
});

Кроме того, отпечаток можно использовать для логирования, отладки и отслеживания. Например, его можно использовать как часть сообщения лога для уникальной идентификации запроса.

namespace App\Exceptions;

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;

class Handler extends ExceptionHandler
{
public function report(Throwable $exception)
{
$fingerprint = request()->fingerprint();
\Log::error('Exception occurred', [
'fingerprint' => $fingerprint,
'exception' => $exception
]);

parent::report($exception);
}
}

Вот как выглядит сообщение в логе, сгенерированное приведённым выше кодом.

[2024-07-20 12:34:56] local.INFO: Request Fingerprint: 123e4567-e89b-12d3-a456-426614174000 {"url":"http://example.com/api/resource"}
[2024-07-20 12:34:57] local.INFO: Handling request in index method {"fingerprint":"123e4567-e89b-12d3-a456-426614174000"}
[2024-07-20 12:34:58] local.ERROR: Exception occurred {"fingerprint":"123e4567-e89b-12d3-a456-426614174000","exception":"[object] (Exception(code: 0): Example exception at /path/to/file.php:123)"}

В заключение

Включение отпечатков запросов в Laravel улучшает отладку и управление запросами, предоставляя уникальные идентификаторы для каждого запроса.

Это позволяет с лёгкостью отслеживать, изолировать проблемы и получать подробный контекст для отладки. Генерируя и регистрируя отпечатки, можно эффективно отслеживать и отлаживать запросы, повышая общую надёжность и сопровождаемость приложения.

Дополнительные материалы

Предыдущая Статья

React 19: Изменение в современной веб-разработке

Следующая Статья

Как вычисляется значение пользовательских свойств в CSS