PHPackages                             illusiard/yii2-rabbitmq - 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. [Queues &amp; Workers](/categories/queues)
4. /
5. illusiard/yii2-rabbitmq

ActiveYii2-extension[Queues &amp; Workers](/categories/queues)

illusiard/yii2-rabbitmq
=======================

Yii2 RabbitMQ extension with lazy AMQP connections, publisher confirms, topology tools, consumers, retries, DLQ helpers, and RPC.

v1.0.0(1mo ago)00BSD-3-ClausePHPPHP &gt;=8.1CI passing

Since Jan 11Pushed 1mo agoCompare

[ Source](https://github.com/Illusiard/yii2-rabbitmq)[ Packagist](https://packagist.org/packages/illusiard/yii2-rabbitmq)[ Docs](https://github.com/Illusiard/yii2-rabbitmq)[ RSS](/packages/illusiard-yii2-rabbitmq/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (7)Versions (3)Used By (0)

illusiard/yii2-rabbitmq
=======================

[](#illusiardyii2-rabbitmq)

Расширение Yii2 RabbitMQ с отложенным соединением, подтверждением публикации и управляемыми handlers c ретраем.

Quickstart
----------

[](#quickstart)

Требования:

- PHP &gt;= 8.1
- Yii2 &gt;= 2.0.55
- RabbitMQ-compatible AMQP broker

Установка:

```
composer require illusiard/yii2-rabbitmq
```

Пакет имеет тип `yii2-extension` и регистрирует bootstrap-класс через `yii2-composer`. В стандартном Yii2-приложении после установки автоматически доступны:

- компонент `rabbitmq`, если он ещё не задан в конфиге приложения;
- console module `rabbitmq`, поэтому CLI-роуты вида `./yii rabbitmq/consume` работают без ручного `controllerMap`.

Первый Packagist-релиз целится в `0.1.0`: API уже пригоден для использования, но minor-релизы до `1.0.0`могут уточнять contracts и namespaces.

Минимальная конфигурация компонента:

```
return [
    'components' => [
        'rabbitmq' => [
            'class' => illusiard\rabbitmq\components\RabbitMqService::class,
            'host' => '127.0.0.1',
            'port' => 5672,
            'user' => 'guest',
            'password' => 'guest',
        ],
    ],
];
```

Если проект не использует стандартную загрузку Yii2 extensions из Composer, подключите модуль явно:

```
return [
    'modules' => [
        'rabbitmq' => [
            'class' => illusiard\rabbitmq\Module::class,
        ],
    ],
];
```

Для graceful shutdown CLI consumers по `SIGTERM`/`SIGINT` нужен `ext-pcntl`. Без него consumers работают, но graceful signal handling отключается.

Discovery для CLI:

```
'components' => [
    'rabbitmq' => [
        'class' => illusiard\\rabbitmq\\components\\RabbitMqService::class,
        'discovery' => [
            'enabled' => true,
            'paths' => [
                '@app/services/rabbitmq/consumers',
                '@app/services/rabbitmq/publishers',
                '@app/services/rabbitmq/middlewares',
                '@app/services/rabbitmq/handlers', // опционально
            ],
            'cache' => 'cache',
            'cacheTtl' => 300,
        ],
    ],
],
```

Структура папок:

```
services/rabbitmq/consumers/OrdersConsumer.php
services/rabbitmq/publishers/OrdersPublisher.php
services/rabbitmq/middlewares/TraceIdMiddleware.php
services/rabbitmq/handlers/OrdersHandler.php

```

Publish:

```
/** @var illusiard\rabbitmq\components\RabbitMqService $rabbit */
$rabbit = Yii::$app->get('rabbitmq');

$rabbit->publish('Hello', 'exchange', 'route.key', [
    'content_type' => 'text/plain',
], [
    'x-trace-id' => 'demo-1',
]);
```

Semantics / Gotchas
-------------------

[](#semantics--gotchas)

- Publisher confirms:
    - Гарантирует, что брокер подтвердил приём публикации на уровне канала (ack/nack).
    - НЕ гарантирует доставку consumer-у и успешную обработку сообщения.
    - Корреляция подтверждений важна: подтверждения сопоставляются по publish sequence no + message\_id.
- mandatory + basic.return:
    - Возникает, когда сообщение unroutable (exchange существует, но нет подходящего binding).
    - Это отдельный класс ошибки от сетевых/канальных: публикация дошла до брокера, но была возвращена.
    - В режиме mandatory без confirm публикация не блокируется ожиданием (без publishTimeout).
    - Возвраты обрабатываются асинхронно через return handler и требуют tick() или event loop.
- delivery\_mode / persistence:
    - Для сохранности при рестарте брокера нужны durable queue + persistent message (`delivery_mode=2`).
    - Пакет не выставляет `delivery_mode` автоматически — задавайте его в `properties` при публикации.
- Retry semantics:
    - Managed retry использует заголовок `x-retry-count`; `x-death` не является источником истины.
    - `x-retry-count` увеличивается при republish и ограничивается `maxAttempts`.
    - `retryExchange` на runtime берётся из `topology.options.retryExchange`; значение из retry policy используется только как fallback.
    - Сообщение уходит в dead при `dead` решении, иначе `reject` приводит к `basic_reject(false)`.
- DLQ inspect semantics:
    - `dlq-inspect` по умолчанию НЕ удаляет сообщения (`basic.get` + `nack requeue=true`).
    - Разрушающий режим только с `--ack=1 --force=1`.
- Consumer fail-fast semantics:
    - Fatal исключения приводят к `ConsumeResult::stop()` (если `consumeFailFast=true`).
    - Recoverable исключения приводят к `ConsumeResult::retry()` и включают retry/dead правила.

Profiles (multi-connection)
---------------------------

[](#profiles-multi-connection)

Если нужно несколько подключений, используйте `profiles` и `defaultProfile`:

```
return [
    'components' => [
        'rabbitmq' => [
            'class' => illusiard\rabbitmq\components\RabbitMqService::class,
            'defaultProfile' => 'default',
            'profiles' => [
                'default' => [
                    'host' => '127.0.0.1',
                    'port' => 5672,
                ],
                'backup' => [
                    'host' => '10.0.0.2',
                    'port' => 5672,
                    'vhost' => '/backup',
                ],
            ],
        ],
    ],
];
```

В коде:

```
$rabbit = Yii::$app->get('rabbitmq');
$rabbit->forProfile('backup')->publish('Hello', 'exchange', 'route.key');
```

Connection hardening
--------------------

[](#connection-hardening)

TLS/SSL передается в `php-amqplib` как `ssl` options для stream context:

```
'components' => [
    'rabbitmq' => [
        'class' => illusiard\rabbitmq\components\RabbitMqService::class,
        'host' => 'rabbitmq.local',
        'port' => 5671,
        'ssl' => [
            'cafile' => '@app/certs/ca.pem',
            'local_cert' => '@app/certs/client.pem',
            'local_pk' => '@app/certs/client.key',
            'verify_peer' => true,
            'verify_peer_name' => true,
        ],
    ],
],
```

Consumer reconnect policy:

```
'consumeReconnectAttempts' => 3,
'consumeReconnectDelaySeconds' => 1,
```

Для входящих сообщений можно ограничить тело и глубину JSON:

```
'maxMessageBodyBytes' => 1024 * 1024,
'jsonDecodeDepth' => 128,
'messageLimitExceededAction' => 'reject', // reject|retry|stop
```

Ошибки лимитов и диагностика соединения не включают тело сообщения или секреты из DSN/token/password.

Profile (project defaults)
--------------------------

[](#profile-project-defaults)

Profile позволяет задать общие defaults для definitions (consumers/publishers) без копипаста опций.
Это отдельная сущность от connection profiles и не обязательна.

Подключение профиля:

```
'components' => [
    'rabbitmq' => [
        'class' => illusiard\\rabbitmq\\components\\RabbitMqService::class,
        'profile' => app\\services\\rabbitmq\\RabbitMqProfile::class,
    ],
],
```

Допустимые значения `profile`: `null`, FQCN, callable или объект.
Если задан FQCN, используется `Yii::createObject()`.

Пример профиля:

```
