cloud-castle/idempotency

Production-ready PHP 8.1+ package (CloudCastle Idempotency).

Maintainers

Package info

gitverse.ru/cloud-castle/idempotency

Homepage

Issues

Documentation

pkg:composer/cloud-castle/idempotency

Transparency log

Statistics

Installs: 1

Dependents: 0

Suggesters: 0

v1.0.1 2026-07-29 08:35 UTC

This package is auto-updated.

Last update: 2026-07-29 13:10:16 UTC


README

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano

CloudCastle Idempotency

CloudCastle Idempotency

Packagist Version Downloads PHP Version License

Идемпотентное выполнение операций поверх любого PSR-16 хранилища: результат первого выполнения сохраняется и возвращается при повторах. Повтор ключа с иными данными отвергается как конфликт — защита от двойной обработки платежей.

Установка

composer require cloud-castle/idempotency

Требуется PHP 8.1+ и любая PSR-16 реализация (например, cloud-castle/cache).

Быстрый старт

<?php

use CloudCastle\Idempotency\Exception\IdempotencyConflictException;
use CloudCastle\Idempotency\IdempotentExecutor;

// $cache — любая PSR-16 реализация; ttl — срок хранения результата.
$executor = new IdempotentExecutor($cache, ttl: 86400);

$key = $request->header('Idempotency-Key');           // ключ от клиента
$fingerprint = hash('sha256', $request->rawBody());   // отпечаток данных

// Операция выполнится один раз; повторы вернут сохранённый результат.
$payment = $executor->execute($key, static fn () => $gateway->charge($amount), $fingerprint);

// Тот же ключ с ДРУГИМИ данными → IdempotencyConflictException.

Возможности

  • Выполнение ровно один раз — операция с данным ключом исполняется однажды; при повторах возвращается сохранённый результат, операция не запускается заново.
  • Контроль отпечатка — повтор ключа с иным отпечатком исходных данных отвергается IdempotencyConflictException (ключ не должен переиспользоваться с другими данными — критично для операций с деньгами).
  • Любое PSR-16 хранилище — работает с любой реализацией кэша; ключи нормализуются (SHA-256) и изолируются префиксом.
  • Настраиваемый срок хранения результата (ttl, по умолчанию сутки).
  • Произвольный тип результата — сохраняется и возвращается как есть.

Безопасность

Идемпотентность — базовая защита от двойного списания при повторной отправке запроса (ретрай сети, двойной клик). Отпечаток данных не даёт злоумышленнику или ошибке переиспользовать чужой/старый ключ с новыми параметрами. Для строгой защиты от гонки двух одновременных запросов с одним ключом дополните внешней блокировкой (cloud-castle/lock).

Сравнение с аналогами

Возможностьidempotencylaravel-idempotencystripe (SDK)symfony/lock (косвенно)ramsey/idempotencyсамописное
Выполнение один раз⚠️⚠️
Конфликт по отпечатку данных🏆 ✅⚠️
Любое PSR-16 хранилище🏆 ✅⚠️⚠️⚠️⚠️
Без привязки к фреймворку🏆 ✅⚠️
Runtime-зависимостей🏆 1 (PSR-16)многомного12+0

Когда применять. idempotency уместен для серверных операций, которые нельзя выполнять дважды: платежи, создание заказов, отправка уведомлений. Даёт ядро «выполнить один раз» без привязки к фреймворку. Если нужен полный HTTP-middleware идемпотентности с автоматическим перехватом заголовка — соберите его поверх этого пакета и cloud-castle/middleware.

Разработка

composer install
composer check    # линтеры + статический анализ + тесты
composer fix      # автоисправления (Rector, PHP CS Fixer, PHPCBF)
composer ci       # полный CI-пайплайн локально

Полный список команд с описаниями: composer run-script --list.

Документация

Лицензия

MIT © CloudCastle (alex-4-17@yandex.ru)

🇷🇺 Русский · 🇬🇧 English · 🇩🇪 Deutsch · 🇫🇷 Français · 🇪🇸 Español · 🇮🇹 Italiano