enqueue/redis
Redis transport for the Enqueue message queue ecosystem. Implements Queue Interop so you can send and consume messages using Redis as the broker. Includes docs, CI, and Packagist distribution for easy integration.
Installation:
composer require enqueue/redis
Requires php-redis extension (ext-redis) and Redis server (v2.6+).
Basic Configuration:
use Enqueue\Redis\RedisConnectionFactory;
use Enqueue\Redis\RedisContext;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$connectionFactory = new RedisConnectionFactory($redis);
$connection = $connectionFactory->createConnection();
First Use Case:
// Producer: Send a message
$context = new RedisContext();
$producer = $connection->createProducer();
$producer->send(new Message('Hello Redis Queue!'));
// Consumer: Process messages
$consumer = $connection->createConsumer('queue_name');
$message = $consumer->receive();
if ($message) {
echo $message->getBody();
$consumer->ack($message);
}
src/ directory for core classes (RedisConnectionFactory, RedisContext, RedisConnection).Producer Pattern:
$producer = $connection->createProducer();
$producer->send(new Message('data', ['priority' => 5])); // Optional headers
send() for fire-and-forget.sendWithDelay() for delayed messages (Redis 2.6+):
$producer->sendWithDelay(new Message('delayed'), 10); // 10 seconds
Consumer Pattern:
$consumer = $connection->createConsumer('queue_name');
while ($message = $consumer->receive()) {
try {
// Process message
$consumer->ack($message);
} catch (\Exception $e) {
$consumer->nack($message); // Reject with requeue
}
}
try-catch to avoid lost messages.receiveNoWait() for non-blocking checks.Connection Management:
$connection = $connectionFactory->createConnection(['queue' => 'my_queue']);
$connection->close(); // Explicitly close when done
Service Provider:
use Enqueue\Redis\RedisConnectionFactory;
use Illuminate\Support\ServiceProvider;
class QueueServiceProvider extends ServiceProvider {
public function register() {
$redis = new \Redis();
$redis->connect(config('redis.default.host'));
$this->app->singleton('redis.connection', function () {
return (new RedisConnectionFactory($redis))->createConnection();
});
}
}
Laravel Queue Integration:
// In config/queue.php
'connections' => [
'redis' => [
'driver' => 'enqueue',
'connection' => 'redis.connection',
],
],
php artisan queue:work redis to run workers.Delayed Jobs:
$job = (new MyJob())->delay(now()->addMinutes(5));
Queue::push('redis', $job);
RedisConnection::createProducer('exchange_name') for pub/sub.$consumer = $connection->createConsumer('queue_name', ['deadLetterQueue' => 'dlq']);
$producer->send(new Message('data', [], 3600)); // Expires in 1 hour
Connection Issues:
RedisException: Connection refused.ping() to test:
$redis->ping(); // Should return true
RedisConnectionFactory:
$connectionFactory = new RedisConnectionFactory($redis, [
'read_write_timeout' => 5.0,
]);
Message Loss:
ack/nack).try-catch and explicitly ack/nack.Priority Queues:
RedisPriorityQueue) or external libraries like php-enqueue/priority-queue.Memory Leaks:
$connection->close();
Serialization:
Message::create() with custom serializers:
$message = Message::create('data', [], new JsonSerializer());
Inspect Queues:
redis-cli LRANGE queue_name 0 -1 # List all messages
redis-cli HGETALL message:uuid # Inspect message metadata
Enable Logging:
$connection = $connectionFactory->createConnection([
'logger' => new \Monolog\Logger('redis', [new \Monolog\Handler\StreamHandler('php://stderr')]),
]);
Check for Blocked Consumers:
redis-cli MONITOR to observe consumer activity.redis-cli BRPOPLPUSH queue_name temp_queue 0
Redis Cluster Support:
predis/predis with RedisConnectionFactory:
$client = new \Predis\Client(['scheme' => 'tcp', 'host' => '127.0.0.1']);
$connectionFactory = new RedisConnectionFactory($client);
SSL/TLS:
$redis = new \Redis();
$redis->connect('redis.example.com', 6379, null, null, \Redis::OPT_SSL);
Environment-Specific Config:
.env for Redis settings:
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_PASSWORD=secret
RedisConnectionFactory:
$redis = new \Redis();
$redis->connect(env('REDIS_HOST'), env('REDIS_PORT'), null, null, \Redis::OPT_AUTH, env('REDIS_PASSWORD'));
Custom Context:
RedisContext to add middleware:
class CustomRedisContext extends RedisContext {
public function __construct() {
$this->middleware([]); // Add middleware
}
}
Message Serialization:
MessageSerializerInterface for custom formats:
class ProtobufSerializer implements MessageSerializerInterface {
public function decode($data) { /* ... */ }
public function encode($message) { /* ... */ }
}
$producer = $connection->createProducer(['serializer' => new ProtobufSerializer()]);
Event Listeners:
$connection->getEventDispatcher()->addListener('message.sent', function ($event) {
// Log or track sent messages
});
How can I help you explore Laravel packages today?