> Как определить заказ для повторного запроса с несколькими попытками (PHP)

Уровень: senior · Роль: backend · Язык: PHP · Категория: Технические вопросы

Компании: Travelata

Стек: PHP

> Пример ответа

Для определения заказа при повторных запросах с несколькими попытками (например, при оплате или регистрации) используется идемпотентность. В PHP это реализуется через уникальный ключ идемпотентности (Idempotency-Key), который клиент передаёт в заголовке запроса.

Алгоритм:

  1. Клиент генерирует UUID (например, 550e8400-e29b-41d4-a716-446655440000) и отправляет его в заголовке Idempotency-Key при первом запросе.
  2. Сервер проверяет, существует ли ключ в хранилище (Redis, БД). Если нет - выполняет операцию, сохраняет результат (статус, ответ) под этим ключом с TTL (например, 24 часа).
  3. При повторном запросе с тем же ключом сервер возвращает сохранённый результат, не выполняя операцию заново.

Пример на PHP (с Redis):

PHP
function processOrder(array $requestData, string $idempotencyKey): array
{
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
// Проверяем, был ли уже обработан запрос
$cachedResult = $redis->get($idempotencyKey);
if ($cachedResult !== false) {
return json_decode($cachedResult, true);
}
// Выполняем бизнес-логику (создание заказа)
$orderId = createOrder($requestData);
$result = ['status' => 'success', 'order_id' => $orderId];
// Сохраняем результат на 24 часа
$redis->setex($idempotencyKey, 86400, json_encode($result));
return $result;
}

Важно: Ключ должен быть уникальным для каждого заказа. Если клиент не передаёт ключ, можно сгенерировать его на основе хеша тела запроса (но это менее надёжно). Для критичных операций (например, платежи) используйте транзакции БД с блокировкой по ключу.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью