> Как определить заказ для повторного запроса с несколькими попытками (PHP)
Уровень: senior · Роль: backend · Язык: PHP · Категория: Технические вопросы
Компании: Travelata
Стек: PHP
> Пример ответа
Для определения заказа при повторных запросах с несколькими попытками (например, при оплате или регистрации) используется идемпотентность. В PHP это реализуется через уникальный ключ идемпотентности (Idempotency-Key), который клиент передаёт в заголовке запроса.
Алгоритм:
- Клиент генерирует UUID (например,
550e8400-e29b-41d4-a716-446655440000) и отправляет его в заголовкеIdempotency-Keyпри первом запросе. - Сервер проверяет, существует ли ключ в хранилище (Redis, БД). Если нет - выполняет операцию, сохраняет результат (статус, ответ) под этим ключом с TTL (например, 24 часа).
- При повторном запросе с тем же ключом сервер возвращает сохранённый результат, не выполняя операцию заново.
Пример на PHP (с Redis):
PHPfunction 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;}
Важно: Ключ должен быть уникальным для каждого заказа. Если клиент не передаёт ключ, можно сгенерировать его на основе хеша тела запроса (но это менее надёжно). Для критичных операций (например, платежи) используйте транзакции БД с блокировкой по ключу.
> Похожие задачи по PHP
Есть ли опыт работы с Domain-Driven Design (DDD)?
Использовали ли Xdebug для отладки PHP
Что такое гексагональная архитектура?
> Похожие задачи по backend
Есть ли в Kotlin аналог equals и hashCode и как это реализовано
Есть ли опыт работы с Domain-Driven Design (DDD)?
Использовали ли Xdebug для отладки PHP
Что такое гексагональная архитектура?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью