PHPackages                             sbooker/persistent-sequences - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. sbooker/persistent-sequences

ActiveLibrary

sbooker/persistent-sequences
============================

Persistent sequences

0.5.1(8mo ago)05.1k1MITPHPPHP ^7.4 || ^8.0

Since Jun 4Pushed 8mo ago1 watchersCompare

[ Source](https://github.com/sbooker/persistent-sequences)[ Packagist](https://packagist.org/packages/sbooker/persistent-sequences)[ RSS](/packages/sbooker-persistent-sequences/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependencies (2)Versions (8)Used By (1)

[Read in English](README.EN.md)

Persistent Sequences (`sbooker/persistent-sequences`)
=====================================================

[](#persistent-sequences-sbookerpersistent-sequences)

[![Latest Version](https://camo.githubusercontent.com/931c30f6b2656c1d4c56106036c98feac538c80e9072f566331d468867329d67/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f73626f6f6b65722f70657273697374656e742d73657175656e6365732e7376673f7374796c653d666c61742d737175617265)](https://img.shields.io/packagist/v/sbooker/persistent-sequences)[![Software License](https://camo.githubusercontent.com/55c0218c8f8009f06ad4ddae837ddd05301481fcf0dff8e0ed9dadda8780713e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d627269676874677265656e2e7376673f7374796c653d666c61742d737175617265)](https://github.com/sbooker/persistent-sequences/blob/master/LICENSE)[![PHP Version](https://camo.githubusercontent.com/1c909d345740c9f8a6a5b972ddaa3718dbb2145850fd29c381601bab79e92480/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f73626f6f6b65722f70657273697374656e742d73657175656e6365732e7376673f7374796c653d666c61742d737175617265)](https://php.net)[![Total Downloads](https://camo.githubusercontent.com/5aa97d92b7fa3aa37ce8485de95fd4998217c86680f56468237e29706744391d/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f73626f6f6b65722f70657273697374656e742d73657175656e6365732e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/sbooker/persistent-sequences)

Конкурентно-безопасная, транзакционная библиотека для создания и управления именованными персистентными последовательностями.

Назначение библиотеки
---------------------

[](#назначение-библиотеки)

Эта библиотека является идеальным инструментом для **построения единых центров генерации идентификаторов (ID)** и бизнес-номеров.

В сложных системах стандартного `AUTO_INCREMENT` бывает недостаточно. `SequenceGenerator` решает следующие задачи:

- **Централизованная генерация ID:** В распределенных системах или при использовании подхода DDD, где ID сущности должен быть сгенерирован до ее сохранения, `SequenceGenerator` может выступать как надежный и транзакционный источник уникальных ID.
- **Именованные бизнес-последовательности:** Создание независимых последовательностей для счетов (`INV-001`), заказов (`ORD-002`) и т.д.
- **Атомарность:** Гарантированное получение следующего значения в последовательности вместе с другими операциями в рамках одной транзакции.
- **Надежность:** Безопасная генерация в СУБД, где `AUTO_INCREMENT` имеет проблемы в кластерных конфигурациях.

Библиотека интегрирована с [sbooker/transaction-manager](https://github.com/sbooker/transaction-manager), что гарантирует безопасность при одновременном доступе.

Ключевые особенности
--------------------

[](#ключевые-особенности)

- **Централизованная генерация ID:** Может использоваться как единый источник правды для генерации уникальных идентификаторов сущностей.
- **Транзакционная безопасность:** Генерация нового значения происходит внутри транзакции, управляемой `transaction-manager`.
- **Безопасность при конкурентном доступе:** Использует `getLocked()` для предотвращения гонок данных.
- **Именованные последовательности:** Неограниченное количество независимых последовательностей.
- **Гибкие алгоритмы:** Используйте встроенный `Increment` или создайте собственную реализацию интерфейса `Algorithm`.
- **Разделение чтения и записи (CQRS):** `SequenceGenerator` для изменения и `SequenceReader` для безопасного чтения текущего значения.

Установка
---------

[](#установка)

```
composer require sbooker/persistent-sequences
```

Вам также понадобится `sbooker/transaction-manager` и его адаптер для вашей ORM.

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

[](#быстрый-старт)

### Шаг 1: Конечная цель — простое получение ID

[](#шаг-1-конечная-цель--простое-получение-id)

Ваш прикладной код для генерации **уникальных ID или бизнес-номеров** будет выглядеть максимально просто:

```
// Генерируем следующий уникальный ID для нового пользователя
$nextUserId = (int)$sequenceGenerator->next('users_pk', new Algorithm\Increment(1));
$user = new User($nextUserId, /* ... */);
$transactionManager->persist($user);

// Получаем следующий номер для счета
$nextInvoiceNumber = $sequenceGenerator->next('invoices', new InvoiceAlgorithm());
// $nextInvoiceNumber будет "INV-2023-0001"
```

### Шаг 2: Сборка зависимостей

[](#шаг-2-сборка-зависимостей)

Для работы `SequenceGenerator` требуется `TransactionManager`.

```
// bootstrap.php или ваш DI-контейнер

/** @var Sbooker\TransactionManager\TransactionManager $transactionManager */
$sequenceGenerator = new Sbooker\PersistentSequences\SequenceGenerator($transactionManager);
```

### Шаг 3: Чтение текущего значения без блокировки (опционально)

[](#шаг-3-чтение-текущего-значения-без-блокировки-опционально)

Если вам нужно просто узнать последнее сгенерированное значение, не увеличивая его, используйте `SequenceReader`.

**1. Реализуйте `SequenceReadStorage`:**

```
// src/Infrastructure/Persistence/DoctrineSequenceReadStorage.php
use Doctrine\ORM\EntityManagerInterface;
use Sbooker\PersistentSequences\Sequence;
use Sbooker\PersistentSequences\SequenceReadStorage;

final class DoctrineSequenceReadStorage implements SequenceReadStorage { /* ... */ }
```

**2. Соберите и используйте `SequenceReader`:**

```
// bootstrap.php или ваш DI-контейнер
/** @var DoctrineSequenceReadStorage $readStorage */
$sequenceReader = new Sbooker\PersistentSequences\SequenceReader($readStorage);

// В вашем коде:
$lastUserId = $sequenceReader->last('users_pk');
```

### Продвинутое использование: собственный алгоритм

[](#продвинутое-использование-собственный-алгоритм)

Вы можете легко создать свой алгоритм, реализовав интерфейс `Algorithm`.

```
// src/Sequences/InvoiceAlgorithm.php
use Sbooker\PersistentSequences\Algorithm;

final class InvoiceAlgorithm implements Algorithm
{
    public function first(): string
    {
        return "INV-2023-0000";
    }

    public function next(string $currentValue): string
    {
        // Простая (но не идеальная) реализация для примера
        [$prefix, $year, $number] = explode('-', $currentValue);
        $nextNumber = str_pad((string)((int)$number + 1), 4, '0', STR_PAD_LEFT);

        return "$prefix-$year-$nextNumber";
    }
}

// Использование:
$nextInvoiceNumber = $sequenceGenerator->next('invoices', new InvoiceAlgorithm());
// вернет "INV-2023-0001"
```

License
-------

[](#license)

See [LICENSE](https://github.com/sbooker/persistent-sequences/blob/master/LICENSE) file.

###  Health Score

38

—

LowBetter than 85% of packages

Maintenance59

Moderate activity, may be stable

Popularity18

Limited adoption so far

Community11

Small or concentrated contributor base

Maturity55

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~317 days

Recently: every ~378 days

Total

7

Last Release

264d ago

PHP version history (2 changes)0.3.0PHP ^7.4

0.5.0PHP ^7.4 || ^8.0

### Community

Maintainers

![](https://www.gravatar.com/avatar/f97b1f6ea03776dda6e0ec26d1ff3a3309972d65bd1376eb111c2b35017af339?d=identicon)[sbooker](/maintainers/sbooker)

---

Top Contributors

[![sbooker](https://avatars.githubusercontent.com/u/3658174?v=4)](https://github.com/sbooker "sbooker (6 commits)")

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/sbooker-persistent-sequences/health.svg)

```
[![Health](https://phpackages.com/badges/sbooker-persistent-sequences/health.svg)](https://phpackages.com/packages/sbooker-persistent-sequences)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
