https://github.com/ssi-anik/amqp
php-amqplib wrapper that eases the consumption of RabbitMQ. A painless way of using RabbitMQ
https://github.com/ssi-anik/amqp
laravel-rabbitmq lumen-rabbitmq php php-amqp php-rabbitmq rabbitmq rabbitmq-consumer
Last synced: 10 months ago
JSON representation
php-amqplib wrapper that eases the consumption of RabbitMQ. A painless way of using RabbitMQ
- Host: GitHub
- URL: https://github.com/ssi-anik/amqp
- Owner: ssi-anik
- License: mit
- Created: 2019-08-22T07:29:01.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-05-30T10:09:25.000Z (over 2 years ago)
- Last Synced: 2024-09-19T03:24:08.748Z (over 1 year ago)
- Topics: laravel-rabbitmq, lumen-rabbitmq, php, php-amqp, php-rabbitmq, rabbitmq, rabbitmq-consumer
- Language: PHP
- Homepage: https://packagist.org/packages/anik/amqp
- Size: 161 KB
- Stars: 134
- Watchers: 6
- Forks: 23
- Open Issues: 2
-
Metadata Files:
- Readme: readme.md
- License: LICENSE
Awesome Lists containing this project
README
anik/amqp
[](https://codecov.io/gh/ssi-anik/amqp)
[](//packagist.org/packages/anik/amqp)
[](//packagist.org/packages/anik/amqp)
[](//packagist.org/packages/anik/amqp)
===
`anik/amqp` is a php-amqplib wrapper that eases the consumption of RabbitMQ. A painless way of using RabbitMQ.
# Note
Previously, the package could be used with Laravel, Laravel Zero, Lumen out of the box. From `v2`, the Laravel support
has been removed. If you are looking for implementation with Laravel, you can
use [anik/laravel-amqp](https://github.com/ssi-anik/laravel-amqp). If you were using this package with Laravel, and you want to upgrade to **Laravel 9**, please consider using [anik/amqp-to-laravel-amqp](https://github.com/ssi-anik/amqp-to-laravel-amqp) if you want to migrate to `anik/laravel-amqp` later.
# Examples
Checkout the [repository](https://github.com/ssi-anik/laravel-rabbitmq-producer-consumer-example) for example.
# Requirements
- PHP `^7.2 | ^8.0`
- PHP-AMQPLib `^3.0`
# Installation
To install the package, run
> `composer require anik/amqp`
# Documentation
For V1: https://medium.com/@sirajul.anik/rabbitmq-for-php-developers-c17cd019a90
## Connection
To create an AMQP Connection, you can use
- `Anik\Amqp\AmqpConnectionFactory::make`
- `Anik\Amqp\AmqpConnectionFactory::makeFromArray`
```php
$host,
'port' => $port,
'user' => $user,
'password' => $password,
'vhost' => $vhost,
],
[
'host' => $host,
'port' => $port,
'user' => $user,
'password' => $password,
'vhost' => $vhost,
]
];
// With AmqpConnectionFactory::makeFromArray method, you can try to connect to multiple host
$connection = AmqpConnectionFactory::makeFromArray($hosts, $options, $ofClass);
```
## Exchange
Also, there are four specific exchange classes.
- `Anik\Amqp\Exchanges\Direct` for **direct** exchange.
- `Anik\Amqp\Exchanges\Fanout` for **fanout** exchange.
- `Anik\Amqp\Exchanges\Headers` for **headers** exchange.
- `Anik\Amqp\Exchanges\Topic` for **topic** exchange.
You can still use `Anik\Amqp\Exchanges\Exchange` base class to create your own exchange.
To instantiate an exchange, you can do like
```php
'anik.amqp.direct.exchange', 'type' => Exchange::TYPE_DIRECT]);
$exchange = new Topic('anik.amqp.topic.exchange');
$exchange = Fanout::make(['name' => 'anik.amqp.fanout.exchange']);
```
When creating an exchange instance with
- `Exchange::make` - `name` and `type` keys must be present in the given array.
- `Topic::make` `Fanout::make` `Headers::make` `Direct::make` - `name` key must be present in the given array.
`Anik\Amqp\Exchanges\Exchange` contains a few predefined exchange types, you can use them as reference.
- `TYPE_DIRECT` for **direct** type.
- `TYPE_TOPIC` for **topic** type.
- `TYPE_FANOUT` for **fanout** type.
- `TYPE_HEADERS` for **headers** type.
The `Exchange::make` method also accepts the following keys when making an exchange instance.
- `declare` Type: `bool`. Default: `false`. If you want to declare the exchange.
- `passive` Type: `bool`. Default: `false`. If the exchange is passive.
- `durable` Type: `bool`. Default: `true`. If the exchange is durable.
- `auto_delete` Type: `bool`. Default: `false`. If the exchange should auto delete.
- `internal` Type: `bool`. Default: `false`. If the exchange is internal.
- `no_wait` Type: `bool`. Default: `false`. If the client should not wait for the server's reply.
- `arguments` Type: `array`. Default: `[]`.
- `ticket` Type: `null | integer`. Default: `null`.
You can also reconfigure the exchange instance using `$exchange->reconfigure($options)`. The `$options` array accepts
the above keys as well.
Also, you can use the following methods to configure your exchange instance.
- `setName` - Accepts: `string`. The only way to change exchange name after instantiation.
- `setDeclare` - Accepts: `bool`.
- `setType` - Accepts: `bool`.
- `setPassive` - Accepts: `bool`.
- `setDurable` - Accepts: `bool`.
- `setAutoDelete` - Accepts: `bool`.
- `setInternal` - Accepts: `bool`.
- `setNowait` - Accepts: `bool`.
- `setArguments` - Accepts: `array`.
- `setTicket` - Accepts: `null | integer`.
## Queue
To instantiate a queue, you can do like
```php
'anik.amqp.direct.exchange.queue']);
```
When creating a queue instance with
- `Queue::make` - `name` keys must be present in the given array.
The `Queue::make` method also accepts the following keys when making a queue instance.
- `declare` Type: `bool`. Default: `false`. If you want to declare the queue.
- `passive` Type: `bool`. Default: `false`. If the queue is passive.
- `durable` Type: `bool`. Default: `true`. If the queue is durable.
- `exclusive` Type: `bool`. Default: `false`. If the queue is exclusive.
- `auto_delete` Type: `bool`. Default: `false`. If the queue should auto delete.
- `no_wait` Type: `bool`. Default: `false`. If the client should not wait for the server's reply.
- `arguments` Type: `array`. Default: `[]`.
- `ticket` Type: `null | integer`. Default: `null`.
You can also reconfigure the queue instance using `$queue->reconfigure($options)`. The `$options` array accepts the
above keys as well.
Also, you can use the following methods to configure your queue instance.
- `setName` - Accepts: `string`. The only way to change queue name after instantiation.
- `setDeclare` - Accepts: `bool`.
- `setType` - Accepts: `bool`.
- `setPassive` - Accepts: `bool`.
- `setDurable` - Accepts: `bool`.
- `setExclusive` - Accepts: `bool`.
- `setAutoDelete` - Accepts: `bool`.
- `setNowait` - Accepts: `bool`.
- `setArguments` - Accepts: `array`.
- `setTicket` - Accepts: `null | integer`.
## Qos
To instantiate a Qos, you can do like
```php
$prefetchSize, 'prefetch_count' => $prefetchCount, 'global' => $global]);
```
The `Qos::make` method also accepts the following key when making a qos instance.
- `prefetch_size` Type: `int`. Default: `0`.
- `prefetch_count` Type: `int`. Default: `0`.
- `global` Type: `bool`. Default: `true`.
You can also reconfigure the qos instance using `$qos->reconfigure($options)`. The `$options` array accepts the above
keys as well.
Also, you can use the following methods to configure your qos instance.
- `setPrefetchCount` - Accepts: `int`.
- `setPrefetchSize` - Accepts: `int`.
- `setGlobal` - Accepts: `bool`.
## Publish/Produce message
To produce/publish messages, you'll need the `Anik\Amqp\Producer` instance. To instantiate the class
```php
publishBatch($messages, $routingKey, $exchange, $options);
```
- `$messages` Type: `Anik\Amqp\Producible[]`. If any of the message is not the type of `Producible` interface, it'll
throw error.
- `$routingKey` Type: `string`. Routing key. Default `''` (empty string).
- `$exchange` Type: `null | Anik\Amqp\Exchanges\Exchange`.
- `$options` Type: `array`. Runtime configuration.
* Key `exchange` - Accepts: `array`.
- If you pass `null` as `$exchange`, then you must provide a valid configuration through this key to create an
exchange under the hood. If you pass `$exchange` with Exchange instance and `$options['exchange']`, exchange
instance will be reconfigured accordingly with the values available in `$options['exchange']`. Keys are same
as `Exchange::make`'s `$options`.
* Key `publish` - Accepts: `array`.
- Key `mandatory` Default `false`.
- Key `immediate` Default `false`.
- Key `ticket` Default `null`.
- Key `batch_count`. Default: `500`. To make a batch of **X** messages before publishing a batch.
### Publish
`Producer::publish` - to publish a single message. Uses `Producer::publishBatch` under the hood.
```php
publish($message, $routingKey, $exchange, $options);
```
- `$message` Type: `Anik\Amqp\Producible`.
- `$routingKey` Type: `string`. Routing key. Default `''` (empty string).
- `$exchange` Type: `null | Anik\Amqp\Exchanges\Exchange`.
- `$options` Type: `array`. Runtime configuration.
* Key `exchange` - Accepts: `array`.
- If you pass `null` as `$exchange`, then you must provide a valid configuration through this key to create an
exchange under the hood. If you pass `$exchange` with Exchange instance and `$options['exchange']`, exchange
instance will be reconfigured accordingly with the values available in `$options['exchange']`. Keys are same
as `Exchange::make`'s `$options`.
* Key `publish` - Accepts: `array`.
- Key `mandatory` Default `false`.
- Key `immediate` Default `false`.
- Key `ticket` Default `null`.
### Publish Basic
`Producer::publishBasic` - to publish a single message using `AMQPChannel::basic_publish` method.
```php
publishBasic($message, $routingKey, $exchange, $options);
```
- `$message` Type: `Anik\Amqp\Producible`.
- `$routingKey` Type: `string`. Routing key. Default `''` (empty string).
- `$exchange` Type: `null | Anik\Amqp\Exchanges\Exchange`.
- `$options` Type: `array`. Runtime configuration.
* Key `exchange` - Accepts: `array`.
- If you pass `null` as `$exchange`, then you must provide a valid configuration through this key to create an
exchange under the hood. If you pass `$exchange` with Exchange instance and `$options['exchange']`, exchange
instance will be reconfigured accordingly with the values available in `$options['exchange']`. Keys are same
as `Exchange::make`'s `$options`.
* Key `publish` - Accepts: `array`.
- Key `mandatory` Default `false`.
- Key `immediate` Default `false`.
- Key `ticket` Default `null`.
## ProducibleMessage: Implementation of Producible Interface
The package comes with `Anik\Amqp\ProducibleMessage`, a generic implementation of `Anik\Amqp\Producible` interface.
You can instantiate the class like
```php
AMQPMessage::DELIVERY_MODE_PERSISTENT,
]);
$msg = (new ProducibleMessage())->setMessage('take my message to rabbitmq')->setProperties([
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT,
'application_headers' => new AMQPTable(['key' => 'value']),
]);
```
## Consumer
To consume messages, you'll need the `Anik\Amqp\Consumer` instance. To instantiate the class
```php
consume($handler, $bindingKey, $exchange, $queue, $qos, $options);
```
- `$handler` Type: `Anik\Amqp\Consumable`.
- `$bindingKey` Type: `string`. Binding key. Default `''` (empty string).
- `$exchange` Type: `null | Anik\Amqp\Exchanges\Exchange`.
- `$queue` Type: `null | Anik\Amqp\Queues\Queue`.
- `$qos` Type: `null | Anik\Amqp\Qos\Qos`.
- `$options` Type: `array`. Runtime configuration.
* `consumer` - Accepts: `array`. Keys are same as `Consumer::__construct`'s options.
* `exchange` - Accepts: `array`. Keys are same as `Exchange::make`'s options.
- If you pass `null` as `$exchange`, then you must provide a valid configuration through this key to create an
exchange under the hood. If you pass `$exchange` with Exchange instance and `$options['exchange']`, exchange
instance will be reconfigured accordingly with the values available in `$options['exchange']`.
* `queue` - Accepts: `array`. Keys are same as `Queue::make`'s options.
- If you pass `null` as `$queue`, then you must provide a valid configuration through this key to create a queue
under the hood. If you pass `$queue` with Queue instance and `$options['queue']`, queue instance will be
reconfigured accordingly with the values available in `$options['queue']`.
* `qos` - Accepts: `array`. Keys are same as `Qos::make`'s options.
- If you pass `$qos` with Qos instance and `$options['qos']`, qos instance will be reconfigured accordingly.
If `$qos` is null and `$options['qos']` holds value, QoS will be applied to the channel. If `$qos` is `null`
and `$options['qos']` is not available, **NO QoS WILL BE APPLIED TO THE CHANNEL**
* `bind` - Accepts: `array`. For binding queue to the exchange.
- `no_wait`. Default `false`.
- `arguments`. Default `[]`.
- `ticket`. Default `null`.
* `consume` - Accepts: `array`. Following values are passed to the `AMQPChannel::wait()`.
- `allowed_methods` Default `null`.
- `non_blocking` Default `false`.
- `timeout` Default `0`.
## ConsumableMessage: Implementation of Consumable Interface
The package comes with `Anik\Amqp\ConsumableMessage`, a generic implementation of `Anik\Amqp\Consumable` interface.
You can instantiate the class like
```php
getMessageBody() . PHP_EOL;
echo $message->getRoutingKey() . PHP_EOL;
$message->ack();
// Alternatively, $original->ack();
/**
* Method: `decodeMessage`
* Returns:
* - `array` if message body contains valid json
* - `null` if json could not be decoded
*/
var_dump($message->decodeMessage());
/**
* Method: `decodeMessageAsObject`
* Returns:
* - `\stdClass` if message body contains valid json
* - `null` if json could not be decoded
*/
var_dump($message->decodeMessageAsObject());
});
```
**NOTE**: Calling any method on `ConsumableMessage` instance without setting **AMQPMessage** will throw exception.
# Issues?
If you find any issue/bug/missing feature, please submit an issue and PRs if possible.