enqueue/simple-client
Enqueue Simple Client combines Enqueue client classes with Symfony components into an easy-to-use SimpleClient facade for sending and consuming messages via queues. Part of the Enqueue ecosystem; see docs and support via the project site.
Installation:
composer require enqueue/simple-client
Ensure enqueue/enqueue and symfony/config are also installed (they are dependencies).
Basic Setup:
Create a SimpleClient instance with a connection to your broker (e.g., RabbitMQ):
use Enqueue\SimpleClient\SimpleClient;
$client = new SimpleClient();
$connection = $client->createConnection(['host' => 'amqp://guest:guest@localhost']);
First Use Case: Publish a message to a queue:
$producer = $connection->createProducer();
$producer->send(new \Enqueue\AmqpExt\Message('Hello, Queue!'));
Consume Messages:
$consumer = $connection->createConsumer('your_queue_name');
$consumer->setMessageHandler(function (\Enqueue\Message $message) {
// Process message
return \Enqueue\Client\FunctionalContext::ACK;
});
$consumer->consume();
Laravel Integration (Optional):
Register the SimpleClient as a queue driver in config/queue.php:
'connections' => [
'enqueue' => [
'driver' => 'enqueue',
'client' => \Enqueue\SimpleClient\SimpleClient::class,
'config' => [
'dsn' => env('QUEUE_CONNECTION_DSN', 'amqp://guest:guest@localhost'),
],
],
],
Facade-Based Dispatching:
Use SimpleClient as a facade to abstract queue operations:
$client = new SimpleClient();
$connection = $client->createConnection(['host' => env('QUEUE_DSN')]);
// Publish a job (e.g., Laravel Job)
$producer = $connection->createProducer();
$producer->send(new \App\Jobs\ProcessPodcast());
Laravel Job Integration:
Extend Laravel’s Job class and dispatch via the enqueue driver:
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
class ProcessPodcast implements ShouldQueue
{
use Queueable;
public $queue = 'enqueue';
}
// Dispatch
ProcessPodcast::dispatch();
Consumer Workflows: Run consumers as Laravel commands or standalone scripts:
// In a Laravel Artisan command
public function handle()
{
$client = new SimpleClient();
$connection = $client->createConnection(['host' => env('QUEUE_DSN')]);
$consumer = $connection->createConsumer('enqueue');
$consumer->setMessageHandler(function ($message) {
// Process message
return \Enqueue\Client\FunctionalContext::ACK;
});
$consumer->consume();
}
Multi-Transport Configuration:
Switch transports dynamically via config (e.g., amqp, redis, fs):
$config = [
'dsn' => env('QUEUE_DSN', 'amqp://guest:guest@localhost'),
// For Redis: 'dsn' => 'redis://localhost'
];
$connection = $client->createConnection($config);
Error Handling and Retries: Use Enqueue’s retry mechanisms:
$producer = $connection->createProducer();
$producer->setMessage(new \Enqueue\AmqpExt\Message('Retry me!'))
->setDelay(1000) // Delay in ms
->setPriority(5); // Priority level
Background Job Processing:
enqueue driver.enqueue:consume or Laravel’s queue:work).Event-Driven Architecture:
Batch Processing:
$producer = $connection->createProducer();
$producer->sendBulk([
new \Enqueue\AmqpExt\Message('Batch job 1'),
new \Enqueue\AmqpExt\Message('Batch job 2'),
]);
Delayed Jobs:
$producer->setDelay(3600000); // 1 hour in ms
$producer->send(new \Enqueue\AmqpExt\Message('Delayed job'));
Laravel Service Provider:
Bind SimpleClient to Laravel’s container for dependency injection:
public function register()
{
$this->app->singleton(\Enqueue\SimpleClient\SimpleClient::class, function ($app) {
return new \Enqueue\SimpleClient\SimpleClient();
});
}
Environment Configuration:
Use Laravel’s .env to manage queue connections:
QUEUE_CONNECTION_DSN=amqp://guest:guest@localhost
QUEUE_CONNECTION=enqueue
Monitoring: Integrate with Laravel Horizon or custom monitoring:
$stats = $connection->getStats();
// Log or expose stats via API
Testing:
Use Enqueue’s test utilities or mock the SimpleClient in PHPUnit:
$mockConnection = $this->createMock(\Enqueue\Client\Connection::class);
$client = new SimpleClient();
$client->setConnection($mockConnection);
Connection Management:
try-finally blocks or dependency injection with Laravel’s container to ensure connections are closed:
try {
$connection = $client->createConnection(['host' => 'amqp://...']);
// Use connection
} finally {
$connection->close();
}
Message Serialization:
Serializable or use JSON serialization:
$message = new \Enqueue\AmqpExt\Message(json_encode($data));
Transport-Specific Quirks:
enqueue/fs transport.Laravel Queue Driver Conflicts:
enqueue driver with Laravel’s native drivers (e.g., database) may cause unexpected behavior.Consumer Blocking:
$consumer->consume(1000); // Timeout in ms
Connection Errors:
amqp://user:pass@host:port/vhost).rabbitmqctl status for RabbitMQ).Message Not Delivered:
Performance Issues:
$consumer->setPrefetchCount(10); // Limit unacknowledged messages
Logging:
$client->setLogger(new \Monolog\Logger('enqueue', [new \Monolog\Handler\StreamHandler('php://stderr')]));
DSN Format:
amqp:// for RabbitMQ, redis:// for Redis, etc.amqp://guest:guest@localhost:5672/%2f (URL-encoded /).Default Exchange:
$producer->setExchange('your_exchange');
Priority Queues:
$producer->setPriority(5);
How can I help you explore Laravel packages today?