PHP code example of illusiard / yii2-rabbitmq
1. Go to this page and download the library: Download illusiard/yii2-rabbitmq library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
illusiard / yii2-rabbitmq example snippets
return [
'components' => [
'rabbitmq' => [
'class' => illusiard\rabbitmq\components\RabbitMqService::class,
'host' => '127.0.0.1',
'port' => 5672,
'user' => 'guest',
'password' => 'guest',
],
],
];
return [
'modules' => [
'rabbitmq' => [
'class' => illusiard\rabbitmq\Module::class,
],
],
];
'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,
],
],
],
/** @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',
]);
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');
'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,
],
],
],
'consumeReconnectAttempts' => 3,
'consumeReconnectDelaySeconds' => 1,
'maxMessageBodyBytes' => 1024 * 1024,
'jsonDecodeDepth' => 128,
'messageLimitExceededAction' => 'reject', // reject|retry|stop
'components' => [
'rabbitmq' => [
'class' => illusiard\\rabbitmq\\components\\RabbitMqService::class,
'profile' => app\\services\\rabbitmq\\RabbitMqProfile::class,
],
],
namespace app\\services\\rabbitmq;
use illusiard\\rabbitmq\\profile\\OptionsMerger;
use illusiard\\rabbitmq\\profile\\RabbitMqProfileInterface;
class RabbitMqProfile implements RabbitMqProfileInterface
{
public function getConsumerDefaults(): array
{
return [
'prefetch' => 10,
'managedRetry' => true,
];
}
public function getPublisherDefaults(): array
{
return [
'confirm' => true,
'properties' => [
'delivery_mode' => 2,
],
];
}
public function getMiddlewareDefaults(): array
{
return [
'consumer' => ['trace', 'metrics'],
'publisher' => ['trace'],
];
}
public function mergeOptions(array $defaults, array $overrides): array
{
return OptionsMerger::merge($defaults, $overrides);
}
}
namespace app\\services\\rabbitmq\\consumers;
use illusiard\\rabbitmq\\definitions\\consumer\\ConsumerInterface;
class OrdersConsumer implements ConsumerInterface
{
public function getQueue(): string
{
return 'orders';
}
public function getHandler()
{
return \\app\\queues\\RabbitMqHandler::class;
}
public function getOptions(): array
{
return [
'prefetch' => 1,
'managedRetry' => true,
'consumeFailFast' => true,
'consumeMiddlewares' => [],
];
}
}
namespace app\\services\\rabbitmq\\publishers;
use illusiard\\rabbitmq\\definitions\\publisher\\AbstractPublisher;
use illusiard\\rabbitmq\\middleware\\CorrelationIdMiddleware;
class OrdersPublisher extends AbstractPublisher
{
public function getExchange(): string
{
return 'orders-exchange';
}
public function getRoutingKey(): string
{
return 'orders.created';
}
public function getOptions(): array
{
return [
'type' => 'order.created',
'properties' => [
'delivery_mode' => 2,
],
'headers' => [
'x-source' => 'checkout',
],
];
}
public function getMiddlewares(): array
{
return [
CorrelationIdMiddleware::class,
];
}
}
$rabbit = Yii::$app->get('rabbitmq');
$rabbit->publishById('orders', ['orderId' => 123], [
'correlationId' => 'corr-1',
'headers' => [
'x-trace-id' => 'trace-1',
],
]);
return [
'components' => [
'rabbitmq' => [
'class' => illusiard\\rabbitmq\\components\\RabbitMqService::class,
'topology' => [
'exchanges' => [
[
'name' => 'orders-exchange',
'type' => 'direct',
'durable' => true,
],
],
'queues' => [
[
'name' => 'orders',
'durable' => true,
'arguments' => [
'x-dead-letter-exchange' => 'orders-retry-exchange',
'x-dead-letter-routing-key' => 'orders.retry',
],
],
[
'name' => 'orders.retry',
'durable' => true,
'arguments' => [
'x-message-ttl' => 60000,
'x-dead-letter-exchange' => 'orders-exchange',
'x-dead-letter-routing-key' => 'orders',
],
],
],
'bindings' => [
[
'exchange' => 'orders-exchange',
'queue' => 'orders',
'routingKey' => 'orders',
],
],
],
],
],
];
'components' => [
'rabbitmq' => [
'class' => illusiard\rabbitmq\components\RabbitMqService::class,
'mandatory' => true,
'returnSink' => illusiard\rabbitmq\amqp\InMemoryReturnSink::class,
'returnSinkEnabled' => true,
],
],
$rabbit = Yii::$app->get('rabbitmq');
$rabbit->publish('payload', 'exchange', 'rk');
// Снять события возвратов и ACK/NACK (если включён confirm).
$rabbit->tick(0.1);
$returns = $rabbit->drainReturns();
'managedRetry' => true,
'retryPolicy' => [
'maxAttempts' => 3,
'retryExchange' => 'retry-exchange',
'retryQueues' => [
['name' => 'orders.retry.5s', 'ttlMs' => 5000],
['name' => 'orders.retry.30s', 'ttlMs' => 30000],
],
'deadQueue' => 'orders.dead',
],
use illusiard\rabbitmq\message\Envelope;
$env = new Envelope(
['orderId' => 123],
['x-trace-id' => 'trace-1'],
[],
'order.created',
'corr-1'
);
$rabbit->publishEnvelope($env, 'orders-exchange', 'orders.created');
$rabbit->publishJson(
['orderId' => 123],
'orders-exchange',
'orders.created',
[
'type' => 'order.created',
'correlationId' => 'corr-1',
'headers' => ['x-trace-id' => 'trace-1'],
]
);
$env = Yii::$app->get('rabbitmq')->decodeEnvelope($meta['body'], $meta);
'publishMiddlewares' => [
illusiard\\rabbitmq\\middleware\\CorrelationIdMiddleware::class,
illusiard\\rabbitmq\\middleware\\PublishLoggingMiddleware::class,
],
'consumeMiddlewares' => [
illusiard\\rabbitmq\\middleware\\ConsumeLoggingMiddleware::class,
],
use illusiard\rabbitmq\message\Envelope;
use illusiard\rabbitmq\rpc\RpcClient;
$client = new RpcClient(Yii::$app->get('rabbitmq'));
$response = $client->call(
new Envelope(['ping' => true], [], [], 'rpc.ping'),
'rpc-exchange',
'rpc.ping',
5
);
use illusiard\rabbitmq\message\Envelope;
use illusiard\rabbitmq\rpc\RpcServer;
$server = new RpcServer(Yii::$app->get('rabbitmq'));
$server->serve('rpc.queue', function (Envelope $request): Envelope {
return new Envelope(['pong' => true], [], [], 'rpc.pong', $request->getCorrelationId());
});
services/rabbitmq/consumers/OrdersConsumer.php
services/rabbitmq/publishers/OrdersPublisher.php
services/rabbitmq/middlewares/TraceIdMiddleware.php
services/rabbitmq/handlers/OrdersHandler.php