elandlord/nats-php
Laravel-friendly PHP client for NATS messaging. Publish/subscribe, request/reply, and queue groups with a simple API. Suitable for event-driven apps, microservices, and background jobs needing fast, lightweight broker communication.
Installation
composer require elandlord/nats-php
Requires PHP 8.1+ and NATS server (v2.9+ recommended).
First Connection
use Elandlord\NatsPhp\Client;
$client = new Client(['servers' => ['nats://localhost:4222']]);
$client->connect();
Publish a Message
$client->publish('user.created', json_encode(['id' => 123]));
Subscribe to Messages
$subscription = $client->subscribe('user.created');
$subscription->onMessage(function ($msg) {
echo $msg->getData(); // Decode JSON as needed
});
tests/ directory for usage examples.Client (connection management)Subscription (message handling)JetStreamClient (for JetStream features)Publish Events
// In a Laravel controller/service
event(new UserCreated($user));
// Or directly via NATS
$client->publish('user.created', $user->toJson());
Consume Events
// In a NATS consumer service
$subscription = $client->subscribe('user.created');
$subscription->onMessage(function ($msg) {
$user = json_decode($msg->getData(), true);
// Process $user
});
Laravel Integration
// Queue worker (app/Console/Kernel.php)
protected function schedule(Schedule $schedule)
{
$schedule->command('nats:consume')->everyMinute();
}
Stream Creation
$js = $client->jetStream();
$js->createStream('user_events', [
'subjects' => ['user.>'],
'retention' => 'limits',
'max_messages' => 1000000,
]);
Durable Subscriptions
$subscription = $client->subscribe('user.created', 'user_service');
$subscription->setDurable(true); // Persists across restarts
Message Processing
$subscription->onMessage(function ($msg) {
try {
// Process message
$msg->ack(); // Acknowledge success
} catch (\Exception $e) {
$msg->nack(); // Negative acknowledgment
}
});
Reconnection Logic
$client->onReconnect(function () {
Log::info('NATS reconnected');
});
Dead Letter Queues (DLQ)
$js->createStream('user_events', [
'deliver_subject' => 'user_events.dlq',
'ack_policy' => 'all',
]);
Connection Management
Client::connect() with reconnect option or implement a health check loop.
$client->connect(['reconnect' => true]);
Message Ordering
stream_name and sequence for ordered processing.Memory Leaks
onMessage handlers.$subscription->unsubscribe() when done or use context managers.
$subscription->unsubscribe();
JetStream Quotas
nats stream info user_events
Enable NATS Logging
$client = new Client([
'servers' => ['nats://localhost:4222'],
'debug' => true, // Enable debug logs
]);
Inspect Messages
$subscription->onMessage(function ($msg) {
Log::debug('Received:', [
'subject' => $msg->getSubject(),
'data' => $msg->getData(),
'headers' => $msg->getHeaders(),
]);
});
Use NATS CLI Tools
nats sub user.created --verbose
nats pub user.created '{"test":1}'
Custom Middleware
$subscription->onMessage(function ($msg) {
// Pre-processing (e.g., validation)
$data = json_decode($msg->getData());
if (!valid($data)) {
$msg->nack();
return;
}
// Hand off to handler
});
Laravel Service Provider
// app/Providers/NatsServiceProvider.php
public function register()
{
$this->app->singleton(Client::class, function ($app) {
return new Client(config('nats.servers'));
});
}
Retry Logic
$subscription->onMessage(function ($msg) {
try {
$this->process($msg);
$msg->ack();
} catch (\Exception $e) {
if ($msg->getRedelivered()) {
$msg->nack(); // Give up after retries
} else {
$msg->nack(); // Retry
}
}
});
Metrics Integration
$subscription->onMessage(function ($msg) use ($metrics) {
$metrics->increment('nats.messages.processed');
// Process message
});
How can I help you explore Laravel packages today?