PHPackages                             monkeyscloud/monkeyslegion-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. [Database &amp; ORM](/categories/database)
4. /
5. monkeyscloud/monkeyslegion-queue

ActiveLibrary[Database &amp; ORM](/categories/database)

monkeyscloud/monkeyslegion-queue
================================

A modular queue system featuring multiple storage drivers, scalable workers, job batching, chaining, rate limiting, events, and an intuitive CLI for managing jobs.

2.0.3(2mo ago)12.1k↓13.7%3MITPHPPHP ^8.4

Since Nov 27Pushed 2mo agoCompare

[ Source](https://github.com/MonkeysCloud/MonkeysLegion-Queue)[ Packagist](https://packagist.org/packages/monkeyscloud/monkeyslegion-queue)[ RSS](/packages/monkeyscloud-monkeyslegion-queue/feed)WikiDiscussions main Synced 2d ago

READMEChangelogDependencies (22)Versions (20)Used By (3)

MonkeysLegion Queue 2.0
=======================

[](#monkeyslegion-queue-20)

A production-grade, driver-agnostic queue system for PHP 8.4+ with automatic retries, job chaining &amp; batching, rate limiting, lifecycle events, a built-in web dashboard, and a comprehensive CLI toolkit.

[![PHP Version](https://camo.githubusercontent.com/bfb98d885e37493cddcc01059ebf02a8872de9da37c12691b8bb6d13fcdca735/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e342532422d626c75652e737667)](https://www.php.net/)[![License](https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667)](LICENSE)

---

What's New in 2.0
-----------------

[](#whats-new-in-20)

Areav1v2Job contractPlain classes with `handle()``DispatchableJobInterface` — typed, explicitSerializationManual payload arrays`JobSerializer` trait — auto-extracts constructor params, freezes objectsWorker DIAll dependencies passed manually`ContainerAware` trait — auto-resolves `QueueEventDispatcher`, `RateLimiterInterface`, `BatchRepository`, `MonkeysLoggerInterface`Rate limitingConcrete `RateLimiter` only`RateLimiterInterface` contract — pluggable implementationsDashboard❌Built-in web UI with `QueueDashboardProvider` auto-discoveryProvider system❌`#[Provider]` attribute + `composer.json` auto-registrationConfigurationPHP array`.mlc` config format (env-driven)DispatcherReturns `void`Returns `Batch` from `batch()->dispatch()` for progress tracking---

Features
--------

[](#features)

✨ **Multiple Queue Drivers** — Redis (production), Database (production), Null (testing)

🔄 **Automatic Retries** — Exponential backoff, configurable max attempts, failed job tracking

⏰ **Delayed Jobs &amp; Dispatching** — Schedule future execution, priority queue support, clean dispatcher API

🔗 **Job Batching &amp; Chaining** — Sequential chains, parallel batches with completion/failure/finally callbacks

⚡ **Rate Limiting** — Token-bucket `RateLimiterInterface`, per-queue or per-job-type throttling

🎯 **Queue Events** — `JobProcessing`, `JobProcessed`, `JobFailed`, `BatchCompleted`

📊 **Web Dashboard** — Real-time queue stats, failed job inspection, maintenance actions — auto-registered via `QueueDashboardProvider`

🛡️ **Production Ready** — Graceful SIGTERM/SIGINT shutdown, memory-limit protection, GC-aware polling, DI-driven worker

---

Installation
------------

[](#installation)

```
composer require monkeyscloud/monkeyslegion-queue
```

> Requires **PHP 8.4+**, the `ext-redis` extension (for the Redis driver), and the MonkeysLegion CLI package.

---

Configuration
-------------

[](#configuration)

### MLC Format (`config/queue.mlc`)

[](#mlc-format-configqueuemlc)

```
queue {
    # The default store to use (redis, database, null)
    default = ${QUEUE_DEFAULT:-null}

    # Core queue behavior
    settings {
        default_queue      = ${QUEUE_DEFAULT_QUEUE:-default}
        failed_queue       = ${QUEUE_FAILED_QUEUE:-failed}
        queue_prefix       = ${QUEUE_PREFIX:-ml_queue}
        retry_after        = ${QUEUE_RETRY_AFTER:-90}
        visibility_timeout = ${QUEUE_VISIBILITY_TIMEOUT:-300}
        max_attempts       = ${QUEUE_MAX_ATTEMPTS:-3}
        path               = ${QUEUE_VIEW_PATH:-ml-queue}
    }

    # Queue drivers
    stores {
        redis {
            host     = ${REDIS_HOST:-127.0.0.1}
            port     = ${REDIS_PORT:-6379}
            username = ${REDIS_USERNAME:-null}
            password = ${REDIS_PASSWORD:-null}
            database = ${REDIS_DATABASE:-0}
            timeout  = ${REDIS_TIMEOUT:-2.0}
        }

        null {}

        database {
            table        = ${QUEUE_DATABASE_TABLE:-jobs}
            failed_table = ${QUEUE_DATABASE_FAILED_TABLE:-failed_jobs}
        }
    }
}

```

### Environment Variables

[](#environment-variables)

```
# Queue
QUEUE_DEFAULT=redis
QUEUE_DEFAULT_QUEUE=default
QUEUE_FAILED_QUEUE=failed
QUEUE_PREFIX=ml_queue
QUEUE_MAX_ATTEMPTS=3

# Redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=
REDIS_DATABASE=0
REDIS_TIMEOUT=2.0

# Database driver
QUEUE_DATABASE_TABLE=jobs
QUEUE_DATABASE_FAILED_TABLE=failed_jobs
```

---

Quick Start
-----------

[](#quick-start)

### 1 — Create a Queue Instance

[](#1--create-a-queue-instance)

```
use MonkeysLegion\Queue\Factory\QueueFactory;
use MonkeysLegion\Database\Contracts\ConnectionInterface;

$config = require 'config/queue.php';

// Null / Redis (no DB connection needed)
$factory = new QueueFactory($config);
$queue   = $factory->make();          // default driver from config

// Database driver requires a ConnectionInterface
$factory = new QueueFactory($config, $dbConnection);
$queue   = $factory->driver('database');
```

### 2 — Define a Job

[](#2--define-a-job)

All dispatchable jobs **must** implement `DispatchableJobInterface`:

```
