iamfarhad/laravel-rabbitmq
Production-ready RabbitMQ queue driver for Laravel with native Queue integration. Built on ext-amqp with connection/channel pooling, configurable topology, Horizon hooks, Octane-safe resets, and optional high-performance basic_consume workers plus admin Artisan commands.
Installation:
composer require iamfarhad/laravel-rabbitmq
pecl install amqp
Ensure ext-amqp is enabled in php.ini.
Publish Config:
php artisan vendor:publish --provider="iamfarhad\LaravelRabbitMQ\LaravelRabbitQueueServiceProvider" --tag="config"
Configure .env:
QUEUE_CONNECTION=rabbitmq
RABBITMQ_HOST=127.0.0.1
RABBITMQ_PORT=5672
RABBITMQ_USER=guest
RABBITMQ_PASSWORD=guest
RABBITMQ_VHOST=/
Dispatch a Job:
dispatch(new App\Jobs\ProcessPodcast($podcast))->onQueue('podcasts');
Run Worker:
php artisan rabbitmq:consume --queue=podcasts
Use this package for high-performance queue processing in production. Start with a simple job dispatch and worker consumption, then explore advanced features like quorum queues, publisher confirms, or multi-host failover as needed.
Job Dispatching:
dispatch() syntax with optional queues/delays.dispatch(new SendEmailJob($user))->onQueue('emails')->delay(now()->addMinutes(5));
Worker Management:
php artisan rabbitmq:consume --queue=emails --consume-mode=poll
php artisan rabbitmq:consume --queue=emails --consume-mode=consume
Multi-Host Failover:
Configure multiple hosts in config/queue.php:
'hosts' => [
['host' => 'rabbitmq-1', 'port' => 5672, ...],
['host' => 'rabbitmq-2', 'port' => 5672, ...],
],
The package automatically balances connections across hosts.
Queue Topology: Define exchanges, routing keys, and queue types (e.g., quorum, priority) in config:
'exchanges' => [
'jobs' => [
'type' => 'topic',
'routing_key' => 'jobs.%s', // %s = queue name
],
],
'queues' => [
'critical' => ['priority' => 10],
'quorum-orders' => ['quorum' => true],
],
Publisher Confirms: Enable for critical workflows where message receipt must be confirmed:
RABBITMQ_PUBLISHER_CONFIRMS_ENABLED=true
RABBITMQ_PUBLISHER_CONFIRMS_TIMEOUT=5
Use in code:
dispatch(new CriticalJob())->withPublisherConfirms();
Delayed Jobs:
Leverage Laravel’s delay() or RabbitMQ’s delayed-message plugin:
RABBITMQ_DELAYED_PLUGIN_ENABLED=true
RABBITMQ_DELAYED_EXCHANGE=delayed
Dead-Letter Routing: Configure failed-job rerouting:
RABBITMQ_REROUTE_FAILED=true
RABBITMQ_FAILED_EXCHANGE=failed.jobs
RABBITMQ_FAILED_ROUTING_KEY=%s.failed
Horizon: Enable with:
RABBITMQ_WORKER=horizon
Requires Horizon installed (laravel/horizon).
Octane: Optimize pool reuse:
RABBITMQ_OCTANE_RESET_ON_REQUEST=false # Default (recommended)
Admin Commands: Manage infrastructure via CLI:
php artisan rabbitmq:exchange-declare jobs --type=topic
php artisan rabbitmq:queue-declare orders --durable=1
php artisan rabbitmq:pool-stats --watch
Missing ext-amqp:
Class AMQPConnection not found.pecl install amqp and enable in php.ini.Parallel Workers Require pcntl:
pcntl extension is required for parallel workers.ext-pcntl or use --num-processes=1.Horizon Events Not Triggering:
RABBITMQ_WORKER=horizon and Horizon is installed.Quorum + Priority Conflicts:
Connection Pool Exhaustion:
php artisan rabbitmq:pool-stats) and adjust:
RABBITMQ_MAX_CONNECTIONS=10
RABBITMQ_MAX_CHANNELS_PER_CONNECTION=100
Delayed Jobs Without Plugin:
RABBITMQ_DELAYED_PLUGIN_ENABLED, uses TTL + dead-letter routing (less precise).Consume Mode Scaling:
consume mode, one queue per worker process is recommended. Scale horizontally with more workers/containers.Enable Verbose Logging:
RABBITMQ_LOG_LEVEL=debug
Logs appear in storage/logs/laravel-rabbitmq.log.
Check Pool Health:
php artisan rabbitmq:pool-stats --watch --interval=5
Look for stalled connections or channel leaks.
Inspect Raw Messages:
Extend RabbitMQJob to access raw AMQP data:
public function getRawBody() { ... }
public function headers() { ... }
Test Failover: Simulate host failures by stopping a RabbitMQ node and verifying workers reconnect.
Lazy Connections:
'lazy' => false,
Transport Protocol:
tcp. Use ssl/tls for secure connections:
'transport' => 'tls',
'port' => 5671, // Default TLS port
After-Commit Behavior:
RABBITMQ_AFTER_COMMIT=true
Custom Job Classes:
RabbitMQJob for raw message handling:
'options' => [
'queue' => [
'job' => App\Jobs\CustomRabbitMQJob::class,
],
],
Event Listeners:
RabbitMQJob to hook into message lifecycle (e.g., reserved(), failed()).Middleware:
public function handle() {
// Custom logic
}
Queue Builders:
$queue = app(\iamfarhad\LaravelRabbitMQ\Queue\RabbitMQQueue::class)
->setQuorum(true)
->setPriority(5);
Custom Exchanges:
app(\iamfarhad\LaravelRabbitMQ\Exchange\RabbitMQExchange::class)
->declare('dynamic-exchange', 'direct', false, false, false);
How can I help you explore Laravel packages today?