checkthiscloud/phpamqplib-messenger
composer require checkthiscloud/phpamqplib-messenger
config/bundles.php:
Jwage\PhpAmqpLibMessengerBundle\PhpAmqpLibMessengerBundle::class => ['all' => true],
config/messenger.php:
'transports' => [
'amqp' => [
'dsn' => 'phpamqplib://guest:guest@localhost:5672/my_vhost/queue_name',
'options' => [
'exchange' => [
'name' => 'my_exchange',
'type' => 'direct',
],
'queue' => [
'name' => 'my_queue',
'durable' => true,
],
],
],
],
use Symfony\Component\Messenger\MessageBusInterface;
$bus = app(MessageBusInterface::class);
$bus->dispatch(new YourMessageClass());
php-amqp ExtensionIf your Laravel app currently uses the php-amqp extension (e.g., via laravel/amqp-messenger), migrate to this package by:
php-amqp from composer.json.messenger.php to use the new DSN format (phpamqplib://).php artisan messenger:consume amqp --time-limit=60.dispatch(new OrderProcessed($orderId)); // Uses default transport
$bus->dispatch(new OrderProcessed($orderId), ['transport' => 'amqp']);
$bus->dispatch(
new SendEmail($userId),
['delay' => 3600] // Delay 1 hour
);
php artisan messenger:consume amqp --limit=10
php artisan messenger:consume amqp --workers=4 --time-limit=300
// In a custom worker script (e.g., `artisan` command)
declare(ticks=1);
pcntl_signal(SIGTERM, function () {
// Trigger shutdown logic
});
# config/messenger.php
transports:
amqp:
dsn: 'phpamqplib://user:pass@rabbitmq:5672/vhost?heartbeat=60'
options:
exchange:
name: 'orders.exchange'
type: 'topic'
durable: true
queue:
name: 'orders.queue'
durable: true
arguments:
x-message-ttl: 86400000 # 24h TTL
// Route messages to different transports
$bus->dispatch(new HighPriorityMessage(), ['transport' => 'amqp_high']);
// app/Providers/AppServiceProvider.php
public function boot()
{
$this->app->make(MessageBus::class)->add(
new RetryFailedJobsMiddleware()
);
}
# config/messenger.php
transports:
amqp:
middleware:
- 'doctrine_transaction'
- 'amqp_confirmation' # Built-in for message acknowledgments
transports:
amqp:
retry_strategy:
max_retries: 3
delay: 1000
DSN Format:
phpamqplib:// (not amqp:// or amqps://).# Wrong
dsn: 'amqp://user:pass@host:5672/vhost'
# Right
dsn: 'phpamqplib://user:pass@host:5672/vhost'
Symfony DI Dependency:
symfony/dependency-injection, which may conflict with existing Symfony packages or Laravel’s native DI.composer why symfony/dependency-injection to check for conflicts.composer.json if needed:
"symfony/dependency-injection": "^6.0"
Message Idempotency:
class OrderProcessed implements MessageInterface
{
public function __construct(
public string $orderId,
public string $messageId // Ensure uniqueness
) {}
}
Consumer Shutdown:
php-amqp, php-amqplib supports asynchronous consumers, but improper shutdowns (e.g., SIGKILL) can leave messages unacknowledged.pcntl signals for graceful shutdowns:
declare(ticks=1);
pcntl_signal(SIGTERM, function () {
// Trigger shutdown in your consumer
$this->connection->close();
exit(0);
});
Queue Binding:
transports:
amqp:
options:
bindings:
- queue: 'orders.queue'
exchange: 'orders.exchange'
routing_key: 'order.created'
SSL/TLS Configuration:
// config/messenger.php
transports:
amqp_ssl:
dsn: 'phpamqplib://user:pass@rabbitmq:5671/vhost'
options:
ssl_options:
local_cert: '/path/to/cert.pem'
local_key: '/path/to/key.pem'
verify_peer: true
Enable Verbose Logging:
php artisan messenger:consume amqp --verbose
Or configure Monolog in config/logging.php:
'channels' => [
'messenger' => [
'driver' => 'single',
'path' => storage_path('logs/messenger.log'),
'level' => 'debug',
],
],
Check Connection Health:
php-amqplib's built-in tools to verify connectivity:
php -r "require 'vendor/autoload.php'; $conn = new PhpAmqpLib\Connection\AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); echo 'Connected!';"
Monitor Failed Jobs:
failed_jobs table will log failed messages. Query it with:
\Illuminate\Support\Facades\DB::table('failed_jobs')->where('connection', 'amqp')->get();
Inspect RabbitMQ:
http://localhost:15672) to check:
$this->app->bind(
\
How can I help you explore Laravel packages today?