PHPackages                             fair/queue - 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. fair/queue

ActiveLibrary[Queues &amp; Workers](/categories/queues)

fair/queue
==========

v0.1.0(1y ago)00PHPPHP ^8.1

Since Feb 10Pushed 1y ago1 watchersCompare

[ Source](https://github.com/just-george/fair-queue)[ Packagist](https://packagist.org/packages/fair/queue)[ RSS](/packages/fair-queue/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (10)Versions (2)Used By (0)

Fast messages/jobs queue with fair distribution
===============================================

[](#fast-messagesjobs-queue-with-fair-distribution)

Shipped with [PhpRedis](https://github.com/phpredis/phpredis) BrokerInterface implementation.

Every message/job pushed into a queue has the fair-tag used to handle the message processing fairly, like so:

```
/**
 * @var BrokerInterface $broker
 */
$message = new SomeMessageOrJob(somePayload: 'user1-job1', fairTag: 'user1');
$broker->push($message);
$message = new SomeMessageOrJob(somePayload: 'user1-job2', fairTag: 'user1');
$broker->push($message);
$message = new SomeMessageOrJob(somePayload: 'user2-job1', fairTag: 'user2');
$broker->push($message);
$message = new SomeMessageOrJob(somePayload: 'user2-job2', fairTag: 'user2');
$broker->push($message);
$message = new SomeMessageOrJob(somePayload: 'user3-job1', fairTag: 'user3');
$broker->push($message);

while (($message = $broker->pop()) !== null) {
    echo $message->getSomePayload() . "\n";
}
//Output (not same order as in input):
//user1-job1
//user2-job1
//user3-job1
//user1-job2
//user2-job2
```

Requirements
------------

[](#requirements)

- PHP: ^8.1
- Redis: ^5
- [PhpRedis](https://github.com/phpredis/phpredis)

Basic features
--------------

[](#basic-features)

- Fair messages distribution based on arbitrary string fair-tag
- Messages with same fair-tag are handled in order of pushing
- Pushing complexity: O(1)
- Popping complexity: O(1) if there are no **empty** queues; O(m) where m is a number of **empty** (not all) queues (they are getting removed during pop operation)
- Zero latency blocking popping support (forget about `sleep(1);`)
- Endless flexibility: add as many workers as many connections your Redis instance can handle

Blocking VS Non-blocking pop
----------------------------

[](#blocking-vs-non-blocking-pop)

### Non-blocking pop

[](#non-blocking-pop)

- returns `NULL` immediately if a queue is empty.

```
// NOT SAFE in case of an empty queue! It would cause 100% CPU load + constant Redis instance requests
while (true) {
    $message = $broker->pop();
    echo $message->getSomePayload() . "\n";
    //sleep(1); popBlocking($timeout);
    echo $message->getSomePayload() . "\n";
}
```

Full working example
--------------------

[](#full-working-example)

```
