Symfony Messenger: āļāļīāļ§, Worker āđāļĨāļ°āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ Async āļŠāļģāļŦāļĢāļąāļāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļ 2026
āļāļđāđāļĄāļ·āļāđāļāļīāļāļĨāļķāļ Symfony Messenger: message bus, transport, worker, middleware āļāđāļāļāļāļąāļāļāđāļāļāļ§āļēāļĄāļāđāļģ, āļāļĨāļĒāļļāļāļāđ retry āđāļĨāļ° streaming AMQP āđāļ Symfony 7.3+

Symfony Messenger āđāļāđāļāļāļāļĄāđāļāđāļāļāļāđāļŦāļĨāļąāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļēāļĢāļāļēāļāđāļāļāļāļ°āļāļīāļāđāļāļĢāļāļąāļŠāđāļāļĢāļ°āļāļāļāļīāđāļ§āļĻ PHP āļŠāļĄāļąāļĒāđāļŦāļĄāđ āļāļāļĄāđāļāđāļāļāļāđāļāļĩāđāļĄāļāļ message bus āļāļĩāđāļĄāļĩāđāļāļĢāļāļŠāļĢāđāļēāļāļāļąāļāđāļāļ, transport āļāļĩāđāļāļģāļŦāļāļāļāđāļēāđāļāđāļŦāļĨāļēāļāļŦāļĨāļēāļĒ āđāļĨāļ° worker āļāļĩāđāļāļđāļāļāļ§āļāļāļļāļĄāļāļĒāđāļēāļāļĢāļąāļāļāļļāļĄ āļāđāļ§āļĒ Symfony 7.3 āđāļĨāļ°āđāļāļāļāļēāļāļŠāļđāđāđāļ§āļāļĢāđāļāļąāļ 8.0 āļāļĩāđāļāļāļĢāđāđāļŦāļĄāđāļāļĒāđāļēāļ middleware āļāđāļāļāļāļąāļāļāđāļāļāļ§āļēāļĄāļāđāļģ, streaming AMQP āđāļĨāļ° Doctrine keepalive āļāļģāđāļŦāđ Messenger āļĄāļĩāļāļ§āļēāļĄāļŠāļēāļĄāļēāļĢāļāđāļāļĩāļĒāļāđāļāđāļēāļāļąāļāļĢāļ°āļāļāļāļīāļ§āđāļāļāļēāļ°āļāļēāļāļāļĒāđāļēāļ Laravel Horizon āļŦāļĢāļ·āļ Sidekiq
Symfony 7.3 āđāļāļīāđāļĄ DeduplicateMiddleware āļŠāļģāļŦāļĢāļąāļāļāļĢāļāļāļāđāļāļāļ§āļēāļĄāļāđāļģāļāļąāļāđāļāļĄāļąāļāļī, Doctrine transport keepalive āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāļŠāđāļāļāđāļģāļāļāļāļāļēāļāļāļĩāđāđāļāđāđāļ§āļĨāļēāļāļēāļ āđāļĨāļ° attribute #[AsMessage] āļŠāļģāļŦāļĢāļąāļāļāļģāļŦāļāļ transport routing āđāļāļāļāļĢāļ°āļāļēāļĻ
āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ Symfony Messenger: Bus, Transport āđāļĨāļ° Worker
āļāļāļĄāđāļāđāļāļāļāđ Messenger āđāļĒāļāļāļ§āļēāļĄāļĢāļąāļāļāļīāļāļāļāļāļāļāļāđāļāđāļāļŠāļēāļĄāļŠāđāļ§āļ: āļāļēāļĢāļŠāđāļ (bus), āļāļēāļĢāļāļāļŠāđāļ (transport) āđāļĨāļ°āļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨ (worker) āļāđāļāļāļ§āļēāļĄ (message) āļāļ·āļāļāļāļāđāļāļāļāđ PHP āļāļĢāļĢāļĄāļāļē Handler āļāļ·āļāļāļĨāļēāļŠāļāļĩāđāļŠāļēāļĄāļēāļĢāļāđāļĢāļĩāļĒāļāđāļāđāļāļēāļāđāļāđ (invokable) Bus āđāļāļ·āđāļāļĄāļāđāļāļāļąāđāļāļŠāļāļāļŠāđāļ§āļ āđāļāļĒāļāļģāļŦāļāļāđāļŠāđāļāļāļēāļāļāđāļēāļ middleware āđāļĨāļ°āđāļĨāļ·āļāļāļāļĩāđāļāļ° serialize āļāđāļāļāļ§āļēāļĄāđāļāļĒāļąāļ transport āđāļāļ·āđāļāļāļĢāļ°āļĄāļ§āļĨāļāļĨāđāļāļāļāļ°āļāļīāļāđāļāļĢāļāļąāļŠ
namespace App\Message;
final readonly class InvoiceGenerated
{
public function __construct(
public int $orderId,
public string $customerEmail,
) {}
}āļāđāļāļāļ§āļēāļĄāļāļĩāđāļāļĢāļĢāļāļļāđāļāļāļēāļ°āļāđāļāļĄāļđāļĨāđāļāļ scalar āđāļāđāļēāļāļąāđāļ āđāļĄāđāđāļāđ entity āļāļāļ Doctrine āļāļēāļĢāļŠāđāļ ID āđāļāļāļāļāļāđāļāļāļāđāđāļāđāļĄāļĢāļđāļāđāļāļāļāđāļ§āļĒāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļąāļāļŦāļē serialization āđāļĨāļ°āļāļģāđāļŦāđāļāđāļāļāļ§āļēāļĄāđāļāļē Handler āļāļ°āļāļķāļāļāđāļāļĄāļđāļĨāļĨāđāļēāļŠāļļāļāļāļēāļāļāļēāļāļāđāļāļĄāļđāļĨ āļ āđāļ§āļĨāļēāļāļĩāđāļāļĢāļ°āļĄāļ§āļĨāļāļĨ
namespace App\MessageHandler;
use App\Message\InvoiceGenerated;
use App\Service\InvoiceService;
use App\Service\MailerService;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
final readonly class InvoiceGeneratedHandler
{
public function __construct(
private InvoiceService $invoiceService,
private MailerService $mailerService,
) {}
public function __invoke(InvoiceGenerated $message): void
{
$pdf = $this->invoiceService->generatePdf($message->orderId);
$this->mailerService->sendInvoice(
$message->customerEmail,
$pdf,
);
}
}āļāļēāļĢ dispatch āļāđāļāļāļ§āļēāļĄāļāļēāļ controller āļŦāļĢāļ·āļ service āđāļāđāđāļāļĩāļĒāļāļāļĢāļĢāļāļąāļāđāļāļĩāļĒāļ§:
$this->bus->dispatch(new InvoiceGenerated(
orderId: $order->getId(),
customerEmail: $order->getCustomer()->getEmail(),
));Bus āļāļ°āļāļąāļāļŠāļīāļāđāļāļ§āđāļēāļāļ°āļāļģāļāļēāļāđāļāļāļāļīāļāđāļāļĢāļāļąāļŠāļŦāļĢāļ·āļāļāļ°āļāļīāļāđāļāļĢāļāļąāļŠāļāļēāļĄāļāļēāļĢāļāļģāļŦāļāļāļāđāļē routing āļāļāļ transport
āļāļēāļĢāļāļģāļŦāļāļāļāđāļē Transport āđāļĨāļ° Backend āļāļīāļ§
Messenger āļĢāļāļāļĢāļąāļāļŦāļĨāļēāļĒ backend: Doctrine DBAL, Redis, Amazon SQS, Beanstalkd, AMQP (RabbitMQ) āđāļĨāļ° streaming AMQP transport āļāļĩāđāđāļāļīāļāļāļąāļ§āđāļāļāļĩ 2025 āđāļāđāļĨāļ° transport āļāļđāļāļāļģāļŦāļāļāļāđāļ§āļĒ DSN string
# config/packages/messenger.yaml
framework:
messenger:
failure_transport: failed
transports:
async_priority_high:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
options:
queue_name: high
retry_strategy:
max_retries: 3
delay: 1000
multiplier: 3
max_delay: 60000
async_priority_low:
dsn: '%env(MESSENGER_TRANSPORT_DSN)%'
options:
queue_name: low
retry_strategy:
max_retries: 5
delay: 5000
multiplier: 2
failed:
dsn: 'doctrine://default?queue_name=failed'
routing:
'App\Message\InvoiceGenerated': async_priority_high
'App\Message\CleanupTempFiles': async_priority_lowāļāļēāļĢāđāļāđāļ transport āļāļēāļĄāļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāļāđāļ§āļĒāđāļŦāđāļāļēāļāļāļĩāđāļāđāļāļāļāļāļāļŠāļāļāļāļĢāļ§āļāđāļĢāđāļ§ (āļŠāļĢāđāļēāļāđāļāđāļāđāļāļŦāļāļĩāđ) āļāļđāļāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļāļāļēāļāļāļģāļĢāļļāļāļĢāļąāļāļĐāļē (āļĨāļāđāļāļĨāđāļāļąāđāļ§āļāļĢāļēāļ§) āđāļāđāļĨāļ° transport āļĄāļĩāļāļĨāļĒāļļāļāļāđ retry āļāļāļāļāļąāļ§āđāļāļ āļāļķāđāļāļāļĢāļąāļāđāļāđāļāļāļēāļĄāļĢāļ°āļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāđāļĨāļ°āļāļļāļāļŠāļĄāļāļąāļāļī idempotent āļāļāļāļāđāļāļāļ§āļēāļĄ
Transport āđāļāļ Doctrine āđāļĄāđāļāđāļāļāļāļēāļĢāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļāđāļāļīāđāļĄāđāļāļīāļĄ āđāļāđāđāļāļīāđāļĄāļ āļēāļĢāļ°āđāļŦāđāļāļēāļāļāđāļāļĄāļđāļĨ Redis āđāļŦāđāļāļ§āļēāļĄāļŦāļāđāļ§āļāļāđāļģāļāļ§āđāļēāļĄāļīāļĨāļĨāļīāļ§āļīāļāļēāļāļĩ AMQP (RabbitMQ) āļĄāļĩ routing āļāļąāđāļāļŠāļđāļ, dead-letter exchange āđāļĨāļ° streaming transport āđāļŦāļĄāđāļŠāļģāļŦāļĢāļąāļāļŠāļāļēāļāļāļēāļĢāļāđ throughput āļŠāļđāļ āļāļēāļĢāđāļĨāļ·āļāļāđāļāđāļāļ§āļĢāļāļīāļāļēāļĢāļāļēāļāļēāļāđāļāļĢāļāļŠāļĢāđāļēāļāļāļ·āđāļāļāļēāļāļāļĩāđāļĄāļĩāļāļĒāļđāđāđāļĨāļ°āļāļ§āļēāļĄāļāđāļāļāļāļēāļĢāļāđāļēāļ throughput
āļāļēāļĢāļāļąāļāļāļēāļĢ Worker āļāđāļ§āļĒ Supervisor
Worker āļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāļēāļ transport āđāļāļŠāļ āļēāļāđāļ§āļāļĨāđāļāļĄ production āļāļģāļŠāļąāđāļ messenger:consume āļāļ°āļāļģāļāļēāļāļ āļēāļĒāđāļāđ process manager āļāļĒāđāļēāļ Supervisor āļŦāļĢāļ·āļ systemd
# āļĢāļąāļāļāđāļāļāļ§āļēāļĄāļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāļŠāļđāļāļāđāļāļ āļāļēāļāļāļąāđāļāļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāļāđāļģ
php bin/console messenger:consume async_priority_high async_priority_low \
--memory-limit=128M \
--time-limit=3600 \
--limit=500flag āļāļģāļāļąāļāļāļąāđāļāļŠāļēāļĄāļāļąāļ§āļāļĩāđāļāđāļāļāļāļąāļāļāļēāļĢāļĢāļąāđāļ§āđāļŦāļĨāļāļāļāļŦāļāđāļ§āļĒāļāļ§āļēāļĄāļāļģāđāļĨāļ°āļāļģāđāļŦāđ worker āļĢāļĩāļŠāļāļēāļĢāđāļāđāļāđāļāļĢāļ°āļĒāļ° Supervisor āļāļ°āđāļĢāļīāđāļĄāļāļĢāļ°āļāļ§āļāļāļēāļĢāđāļŦāļĄāđāđāļāļĒāļāļąāļāđāļāļĄāļąāļāļīāļŦāļĨāļąāļāļāļēāļāļāļāļāđāļāđāļĨāļ°āļāļĢāļąāđāļ
; /etc/supervisor/conf.d/messenger-worker.conf
[program:messenger-consume]
command=php /var/www/app/bin/console messenger:consume async_priority_high async_priority_low --memory-limit=128M --time-limit=3600
user=www-data
numprocs=2
process_name=%(program_name)s_%(process_num)02d
autostart=true
autorestart=true
startsecs=0
stopwaitsecs=30
stdout_logfile=/var/log/messenger-worker.log
stderr_logfile=/var/log/messenger-worker-error.logāļāļēāļĢāļāļąāđāļāļāđāļē numprocs=2 āļāļ°āļŠāļĢāđāļēāļ worker āđāļāļāļāļāļēāļāļŠāļāļāļāļąāļ§ āļāļģāđāļŦāđ throughput āđāļāļīāđāļĄāđāļāđāļāļŠāļāļāđāļāđāļē āļŠāļēāļĄāļēāļĢāļāļāļĢāļąāļāļāļģāļāļ§āļāļāļēāļĄ core CPU āļāļāļāđāļāļīāļĢāđāļāđāļ§āļāļĢāđāđāļĨāļ°āđāļ§āļĨāļēāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļāļ§āļēāļĄ
Pipeline Middleware āđāļĨāļ° CQRS āļāđāļ§āļĒāļŦāļĨāļēāļĒ Bus
Middleware āļāļĢāļāļāļāļĨāļļāļĄāļāļļāļāļāļēāļĢ dispatch āļāđāļāļāļ§āļēāļĄ āđāļāļīāđāļĄ cross-cutting concern āļāđāļēāļāđ stack middleware āđāļāļāļąāļ§āļāļąāļāļāļēāļĢ validation, Doctrine transaction āđāļĨāļ° routing
# config/packages/messenger.yaml
framework:
messenger:
default_bus: command.bus
buses:
command.bus:
middleware:
- validation
- doctrine_transaction
query.bus:
middleware:
- validation
event.bus:
default_middleware:
allow_no_handlers: true
middleware:
- validationāļāļēāļĢāļāļģāļŦāļāļāļāđāļēāļāļĩāđāļāļģāļĢāļđāļāđāļāļ CQRS (Command Query Responsibility Segregation) āļĄāļēāđāļāđ Command āđāļāļĨāļĩāđāļĒāļāđāļāļĨāļ state āļ āļēāļĒāđāļ Doctrine transaction Query āļāđāļēāļāļāđāļāļĄāļđāļĨāļāļĒāđāļēāļāđāļāļĩāļĒāļ§ Event āļāļāļļāļāļēāļāđāļŦāđāđāļĄāđāļĄāļĩ handler āđāļĨāļĒāļāđāđāļāđ āļāļģāđāļŦāđāļŠāļēāļĄāļēāļĢāļāđāļāđāļĢāļđāļāđāļāļ pub/sub āļāļĩāđ listener āļŠāļēāļĄāļēāļĢāļāđāļāļīāđāļĄāđāļāđāļēāļĄāļēāđāļāđāļāļĒāđāļēāļāļāļīāļŠāļĢāļ°
āļāļĢāđāļāļĄāļāļĩāđāļāļ°āļāļīāļāļīāļāļāļēāļĢāļŠāļąāļĄāļ āļēāļĐāļāđ Symfony āđāļĨāđāļ§āļŦāļĢāļ·āļāļĒāļąāļāļāļĢāļąāļ?
āļāļķāļāļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāđāļāļāđāļāđāļāļāļ, flashcards āđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
Middleware āļāđāļāļāļāļąāļāļāđāļāļāļ§āļēāļĄāļāđāļģāđāļ Symfony 7.3
āļāđāļāļāļ§āļēāļĄāļāđāļģāļŠāļīāđāļāđāļāļĨāļ·āļāļāļāļĢāļąāļāļĒāļēāļāļĢāđāļĨāļ°āļāļēāļāļāđāļāđāļŦāđāđāļāļīāļāļāļĨāļāđāļēāļāđāļāļĩāļĒāļ āđāļāđāļ āđāļĢāļĩāļĒāļāđāļāđāļāđāļāļīāļāļĨāļđāļāļāđāļēāļŠāļāļāļāļĢāļąāđāļ Symfony 7.3 āđāļāļīāļāļāļąāļ§ DeduplicateMiddleware āđāļāļ·āđāļāļāđāļēāļĄāļāđāļāļāļ§āļēāļĄāļāļĩāđāđāļŦāļĄāļ·āļāļāļāļąāļāļāļķāđāļāļāļĒāļđāđāđāļāļāļīāļ§āđāļĨāđāļ§āđāļāļĒāļāļąāļāđāļāļĄāļąāļāļī
namespace App\Message;
use Symfony\Component\Messenger\Stamp\DeduplicateStamp;
final readonly class SendWelcomeEmail
{
public function __construct(
public int $userId,
) {}
}// Dispatch āļāļĢāđāļāļĄāļāļēāļĢāļāđāļāļāļāļąāļāļāđāļāļāļ§āļēāļĄāļāđāļģ
use Symfony\Component\Messenger\Stamp\DeduplicateStamp;
$this->bus->dispatch(
new SendWelcomeEmail(userId: 42),
[new DeduplicateStamp(id: 'welcome-email-42')],
);DeduplicateStamp āļĢāļąāļāļāļąāļ§āļĢāļ°āļāļļ lock resource āļŦāļēāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĄāļĩ ID āđāļāļĩāļĒāļ§āļāļąāļāļāļĒāļđāđāđāļāļŠāļāļēāļāļ° pending āļāļĒāļđāđāđāļĨāđāļ§ āļāļēāļĢ dispatch āđāļŦāļĄāđāļāļ°āļāļđāļāļāđāļēāļĄāđāļāđāļāļĒāđāļĄāđāđāļāđāļāđāļāļ·āļāļ āļāļĩāđāļāļāļĢāđāļāļĩāđāļāđāļāļāđāļāđāļāļāļĄāđāļāđāļāļāļāđ Lock āļĢāđāļ§āļĄāļāļąāļ store āļāļĩāđ serialize āđāļāđ (Redis, Memcached āļŦāļĢāļ·āļāļāļēāļāļāđāļāļĄāļđāļĨ)
āļāļĨāļĒāļļāļāļāđ Retry āđāļĨāļ° Failure Transport
āđāļĄāļ·āđāļ handler āđāļĒāļ exception, Messenger āļāļ°āļĨāļāļāļŠāđāļāļāđāļāļāļ§āļēāļĄāļāđāļģāļāļēāļĄāļāļĨāļĒāļļāļāļāđ retry āļāļāļ transport āļŦāļĨāļąāļāļāļēāļāļŦāļĄāļāļāļģāļāļ§āļāļāļĢāļąāđāļāļāļĩāđāļāļģāļŦāļāļ āļāđāļāļāļ§āļēāļĄāļāļ°āļāļđāļāļĒāđāļēāļĒāđāļāļĒāļąāļ failure transport
namespace App\MessageHandler;
use App\Message\ProcessPayment;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
use Symfony\Component\Messenger\Exception\RecoverableMessageHandlingException;
#[AsMessageHandler]
final class PaymentHandler
{
public function __invoke(ProcessPayment $message): void
{
try {
$this->gateway->charge($message->amount, $message->token);
} catch (GatewayTimeoutException $e) {
// āļāļđāđāļāļ·āļāđāļāđ: āļĨāļāļāđāļŦāļĄāđāļāđāļ§āļĒ backoff
throw new RecoverableMessageHandlingException(
'Payment gateway timeout, retrying',
previous: $e,
);
} catch (InvalidCardException $e) {
// āļāļđāđāļāļ·āļāđāļĄāđāđāļāđ: āļŠāđāļāđāļ failure transport āļāļąāļāļāļĩ
throw new UnrecoverableMessageHandlingException(
'Invalid card, no retry',
previous: $e,
);
}
}
}RecoverableMessageHandlingException āđāļĢāļĩāļĒāļāđāļāđāļāļĨāļĒāļļāļāļāđ retry āļŠāđāļ§āļ UnrecoverableMessageHandlingException āļāđāļēāļĄāļāļēāļĢ retry āļāļąāđāļāļŦāļĄāļāđāļĨāļ°āļŠāđāļāļāđāļāļāļ§āļēāļĄāļāļĢāļāđāļāļĒāļąāļ failure transport āļāļēāļĢāđāļĒāļāđāļĒāļ°āļāļĩāđāļāđāļ§āļĒāđāļĄāđāđāļŦāđāđāļŠāļĩāļĒāļāļģāļāļ§āļāļāļĢāļąāđāļ retry āļāļąāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĨāđāļĄāđāļŦāļĨāļ§āļāļĒāđāļēāļāļāļēāļ§āļĢ
# āļāļĢāļ§āļāļŠāļāļāđāļĨāļ°āļāļąāļāļāļēāļĢāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĨāđāļĄāđāļŦāļĨāļ§
php bin/console messenger:failed:show
php bin/console messenger:failed:show 20 --transport=failed
# āļĨāļāļāļŠāđāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļĢāļ°āļāļļāļāļĩāļāļāļĢāļąāđāļ
php bin/console messenger:failed:retry 20 30
# āļāļĢāļāļāđāļĨāļ°āļĨāļāļāļēāļĄāļāļĨāļēāļŠ (Symfony 7.3+)
php bin/console messenger:failed:remove --class-filter="App\Message\CleanupTempFiles"āļāļĨāđāļāļāļēāļĢ retry āļŦāļĄāļēāļĒāļāļ§āļēāļĄāļ§āđāļē handler āļāļēāļāļāļđāļāđāļĢāļĩāļĒāļāđāļāđāļŦāļĨāļēāļĒāļāļĢāļąāđāļāļŠāļģāļŦāļĢāļąāļāļāđāļāļāļ§āļēāļĄāđāļāļĩāļĒāļ§āļāļąāļ āļāļļāļ handler āļāļ§āļĢāļāļāļāđāļāļāđāļŦāđāđāļāđāļ idempotent: āļāļĢāļ§āļāļŠāļāļāļ§āđāļēāļāļēāļāđāļŠāļĢāđāļāđāļĨāđāļ§āļŦāļĢāļ·āļāđāļĄāđāļāđāļāļāļāļģāļāđāļģ āđāļāđ unique constraint āđāļāļāļēāļāļāđāļāļĄāļđāļĨāļŦāļĢāļ·āļ flag āļŠāļāļēāļāļ°āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļģ
Doctrine Keepalive āđāļĨāļ°āļāđāļāļāļ§āļēāļĄāļāļĩāđāđāļāđāđāļ§āļĨāļēāļāļēāļ
Handler āļāļĩāđāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļāļ§āļēāļĄāđāļāđāļāđāļ§āļĨāļēāļāļēāļāđāļŠāļĩāđāļĒāļāļāļĩāđāļāļ°āļāļđāļāļŠāđāļāļāđāļģāđāļĄāļ·āđāļ visibility timeout āļāļāļ transport āļŦāļĄāļāļāļēāļĒāļļ Symfony 7.2 āđāļāļīāļāļāļąāļ§ keepalive āļŠāļģāļŦāļĢāļąāļ Redis, SQS āđāļĨāļ° Beanstalkd āļŠāđāļ§āļ Symfony 7.3 āļāļĒāļēāļĒāļāļĩāđāļāļāļĢāđāļāļĩāđāđāļāļĒāļąāļ transport Doctrine
# āđāļāļīāļ keepalive āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāļŠāđāļāļāđāļģāļĢāļ°āļŦāļ§āđāļēāļāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļĩāđāđāļāđāđāļ§āļĨāļēāļāļēāļ
php bin/console messenger:consume async --keepaliveflag --keepalive āļāļ°āļāļąāļāđāļāļ timestamp delivered_at āđāļāļāļēāļĢāļēāļ transport āļāļāļ Doctrine āđāļāđāļāļĢāļ°āļĒāļ° āđāļāļ·āđāļāđāļāđāļāļ§āđāļē worker āļĒāļąāļāļāļāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļāļāļ§āļēāļĄāļāļĒāļđāđ āļŦāļēāļāđāļĄāđāđāļāđ flag āļāļĩāđ āļāđāļāļāļ§āļēāļĄāļāļĩāđāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāļēāļāļāļ§āđāļē timeout āļāļāļ transport (āļāđāļēāđāļĢāļīāđāļĄāļāđāļ 5 āļāļēāļāļĩ) āļāļ°āļāļđāļ worker āļāļ·āđāļāļāļģāđāļāļāļĢāļ°āļĄāļ§āļĨāļāļĨ āļāļģāđāļŦāđāđāļāļīāļāļāļēāļĢāļāļģāļāļēāļāļāđāļģāļāđāļāļ
Attribute #[AsMessage] āļŠāļģāļŦāļĢāļąāļ Routing āđāļāļāļāļĢāļ°āļāļēāļĻ
Symfony 7.2 āđāļāļīāļāļāļąāļ§ attribute #[AsMessage] āļāļķāđāļāļĒāđāļēāļĒāļāļēāļĢāļāļģāļŦāļāļ transport routing āļāļēāļ YAML āđāļāļĒāļąāļāļāļĨāļēāļŠ message āđāļāļĒāļāļĢāļ
namespace App\Message;
use Symfony\Component\Messenger\Attribute\AsMessage;
#[AsMessage(transport: 'async_priority_low')]
final readonly class GenerateReport
{
public function __construct(
public int $reportId,
public string $format = 'pdf',
) {}
}āļ§āļīāļāļĩāļāļĩāđāđāļĄāđāļāđāļāļāļāļģāļŦāļāļāļŠāđāļ§āļ routing āđāļ messenger.yaml āļŠāļģāļŦāļĢāļąāļāļāđāļāļāļ§āļēāļĄāļāļąāđāļāļāļĩāļāļāđāļāđāļ Transport āļāļđāļāļāļĢāļ°āļāļēāļĻāļāļĩāđāļāđāļāļāļēāļ āļāļģāđāļŦāđ codebase āļāļāļīāļāļēāļĒāļāļąāļ§āđāļāļāđāļāđāļāļąāļāđāļāļ āļāļąāđāļāļŠāļāļāļ§āļīāļāļĩ (routing YAML āđāļĨāļ° attribute) āļŠāļēāļĄāļēāļĢāļāđāļāđāļĢāđāļ§āļĄāļāļąāļāđāļāđ āđāļāļĒ attribute āļāļ°āļĄāļĩāļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāļŠāļđāļāļāļ§āđāļē
Streaming AMQP Transport āļŠāļģāļŦāļĢāļąāļāļāļīāļ§ Throughput āļŠāļđāļ
Transport AMQP āđāļāļāļāļąāđāļāđāļāļīāļĄāđāļāđ polling (get()) āđāļāļ·āđāļāļāļķāļāļāđāļāļāļ§āļēāļĄ āļāļķāđāļāļŠāļĢāđāļēāļāļ āļēāļĢāļ°āļāļĩāđāđāļĄāđāļāļģāđāļāđāļāļāļ RabbitMQ āļŠāđāļ§āļ streaming AMQP transport āļāļĩāđāđāļāļīāļāļāļąāļ§āđāļāļāļĩ 2025 āđāļāļĨāļĩāđāļĒāļāđāļāđāļāđāļĄāđāļāļĨ push (consume()) āļāļķāđāļāļĨāļāļāļ§āļēāļĄāļŦāļāđāļ§āļāđāļĨāļ°āļāļēāļĢāđāļāđāļāļĢāļąāļāļĒāļēāļāļĢ
# config/packages/messenger.yaml
framework:
messenger:
transports:
streaming:
dsn: 'amqp-lib://guest:guest@localhost:5672/%2f/messages'
options:
exchange:
name: app_events
type: topic
queues:
order_events:
binding_keys: ['order.*']āļāļ§āļēāļĄāđāļāļāļāđāļēāļāļŦāļĨāļąāļāļāļēāļ transport AMQP āđāļĢāļīāđāļĄāļāđāļ: āđāļĄāđāļāđāļāļāđāļāđ C extension (āđāļāđ php-amqplib), āļāļēāļĢāļŠāđāļāđāļāļ streaming āļāđāļēāļāļāļēāļĢāđāļāļ·āđāļāļĄāļāđāļ TCP āļāļĩāđāļāļāļāļĒāļđāđāļĒāļēāļ§āļāļēāļ āđāļĨāļ°āļĢāļāļāļĢāļąāļ topic exchange āļāļĢāđāļāļĄ routing binding key āđāļāļ native Transport āļāļĩāđāļŠāļēāļĄāļēāļĢāļāļāļąāļāļāļēāļĢāļāđāļāļāļ§āļēāļĄāļŦāļĨāļēāļĒāļāļąāļāļĢāļēāļĒāļāļēāļĢāļāđāļāļ§āļīāļāļēāļāļĩāļāđāļ§āļĒ CPU overhead āļāļĩāđāļāđāļāļĒāļĄāļēāļ
āļŠāļĢāļļāļ
- āļŠāđāļ ID āđāļāļ scalar āđāļāļāđāļāļāļ§āļēāļĄ āđāļĄāđāđāļāđ entity āļāļāļ Doctrine; āļāļķāļāļāđāļāļĄāļđāļĨāļĨāđāļēāļŠāļļāļāđāļ handler āđāļāļ·āđāļāļŦāļĨāļĩāļāđāļĨāļĩāđāļĒāļāļāļąāļāļŦāļē serialization āđāļĨāļ° state āļāļĩāđāļĨāđāļēāļŠāļĄāļąāļĒ
- āđāļāđāļ transport āļāļēāļĄāļĨāļģāļāļąāļāļāļ§āļēāļĄāļŠāļģāļāļąāļāđāļĨāļ°āļĢāļ°āļāļąāļāļ§āļīāļāļĪāļ; āđāļāđāļĨāļ° transport āļĄāļĩāļāļĨāļĒāļļāļāļāđ retry āđāļĨāļ° pool worker āļāļāļāļāļąāļ§āđāļāļ
- āđāļāđ
RecoverableMessageHandlingExceptionāđāļĨāļ°UnrecoverableMessageHandlingExceptionāđāļāļ·āđāļāļāļ§āļāļāļļāļĄāļāļĪāļāļīāļāļĢāļĢāļĄ retry āļāļĒāđāļēāļāļāļąāļāđāļāļ - āđāļāļīāļ
--keepaliveāļāļ worker transport Doctrine āđāļāļ·āđāļāļāđāļāļāļāļąāļāļāļēāļĢāļŠāđāļāļāđāļģāļāļāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāđāļāđāđāļ§āļĨāļēāļāļēāļ - āđāļāđ
DeduplicateStampāļāļąāļāļāđāļāļāļ§āļēāļĄāļāļĩāđāļāļēāļĢāļāļĢāļ°āļĄāļ§āļĨāļāļĨāļāđāļģāļāđāļāđāļŦāđāđāļāļīāļāļāļĨāļāđāļēāļāđāļāļĩāļĒāļ (āļāļēāļĢāļāļģāļĢāļ°āđāļāļīāļ, āļāļĩāđāļĄāļĨ, āļāļēāļĢāđāļāđāļāđāļāļ·āļāļ) - āļāļģ CQRS āļĄāļēāđāļāđāļāđāļ§āļĒāļŦāļĨāļēāļĒ bus: command bus āļŠāļģāļŦāļĢāļąāļ mutation āļāļĢāđāļāļĄ Doctrine transaction, query bus āļŠāļģāļŦāļĢāļąāļāļāđāļēāļāļāđāļāļĄāļđāļĨ, event bus āļŠāļģāļŦāļĢāļąāļ pub/sub
- āđāļāđ Supervisor āļŦāļĢāļ·āļ systemd āđāļ production āļāļĢāđāļāļĄ flag
--memory-limit,--time-limitāđāļĨāļ°--limitāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļēāļĢāļ§āļāļāļĢāļāļĩāļ§āļīāļ worker - āļāļīāļāļēāļĢāļāļē streaming AMQP transport āļŠāļģāļŦāļĢāļąāļāļŠāļāļēāļāļāļēāļĢāļāđ throughput āļŠāļđāļāļāļĩāđāļāđāļāļāļāļēāļĢāļāļ§āļēāļĄāļŦāļāđāļ§āļāļāđāļģāļāļ§āđāļēāļĄāļīāļĨāļĨāļīāļ§āļīāļāļēāļāļĩ
āđāļĢāļīāđāļĄāļāļķāļāļāđāļāļĄāđāļĨāļĒ!
āļāļāļŠāļāļāļāļ§āļēāļĄāļĢāļđāđāļāļāļāļāļļāļāļāđāļ§āļĒāļāļąāļ§āļāļģāļĨāļāļāļŠāļąāļĄāļ āļēāļĐāļāđāđāļĨāļ°āđāļāļāļāļāļŠāļāļāđāļāļāļāļīāļāļāļĢāļąāļ
āđāļāđāļ
āđāļāļĢāđ
āļāļāļāļ§āļēāļĄāļāļĩāđāđāļāļĩāđāļĒāļ§āļāđāļāļ

āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Symfony: 25 āļāļąāļāļāļąāļāđāļĢāļāđāļāļāļĩ 2026
25 āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđ Symfony āļāļĩāđāļāļđāļāļāļēāļĄāļāđāļāļĒāļāļĩāđāļŠāļļāļ āļŠāļāļēāļāļąāļāļĒāļāļĢāļĢāļĄ, Doctrine ORM, āļāļĢāļīāļāļēāļĢ, āļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ, āļāļāļĢāđāļĄāđāļĨāļ°āļāļēāļĢāļāļāļŠāļāļ āļāļĢāđāļāļĄāļāļģāļāļāļāļĨāļ°āđāļāļĩāļĒāļāđāļĨāļ°āļāļąāļ§āļāļĒāđāļēāļāđāļāđāļ

āļĢāļ°āļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ Symfony āļāļĩ 2026: Voters, Firewalls āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāđāļāļāļāļīāļ
āļāļđāđāļĄāļ·āļāđāļāļīāļāļĨāļķāļāļĢāļ°āļāļāļāļ§āļēāļĄāļāļĨāļāļāļ āļąāļĒ Symfony: firewalls, voters, IsGranted attribute, āļāļĨāļĒāļļāļāļāđāļāļēāļĢāļāļąāļāļŠāļīāļāđāļ, āļāļēāļĢ debug āļāđāļēāļ Twig āđāļ Symfony 7.4 āđāļĨāļ°āļāļģāļāļēāļĄāļŠāļąāļĄāļ āļēāļĐāļāđāļāļēāļāļŠāļģāļŦāļĢāļąāļāļāļąāļāļāļąāļāļāļē PHP

Symfony Live Components āđāļĨāļ° UX 3.0: āđāļāļāļāļĨāļīāđāļāļāļąāļāđāļāļ Reactive āđāļāļĒāđāļĄāđāļāđāļāļāđāļāđ JavaScript āđāļāļāļĩ 2026
Symfony Live Components āļŠāļĢāđāļēāļāļāļīāļāđāļāļāļĢāđāđāļāļāđāļāļ reactive āļāđāļ§āļĒ PHP āđāļĨāļ° Twig āđāļāļĒāđāļĄāđāļāđāļāļāđāļāđ JavaScript āļāļāļāđāļ§āļĒāļŠāļāļāđāļāļĩāđāļĒāļ§āļāļąāļ LiveProp, LiveAction, form āđāļĨāļ° deferred loading