Direkt zum Inhalt

PHP-Code asynchron mit Symfony Messenger ausführen

Das Problem der synchronen Ausführung

Im traditionellen PHP wird der Code synchron ausgeführt: Jede Anweisung wartet auf das Ende der vorherigen. Dies ist problematisch, wenn ein Vorgang mehrere Sekunden dauert:

<?php 

public function sendNotification(User $user)
{
    $this->emailService->sendWelcomeEmail($user); // 4 secondes
    $this->smsService->sendConfirmation($user);   // 2 seconde
    $this->analytics->trackAction($user);         // 1 seconde
    
    // Total : 7 secondes d'attente pour l'utilisateur !
    return $this->render('confirmation.html.twig');
}

Ergebnis: Der Benutzer wartet vor einem Bildschirm, der lädt.
Um dieses Problem zu lösen, kann man „Symfony Messenger” verwenden, um die Ausführung schwerer Skripte zu verschieben.

Einrichtung von Symfony Messenger

Symfony Messenger wird in der offiziellen Dokumentation  offiziellen Dokumentation. bereits recht gut beschrieben. Wir konzentrieren uns hier auf den Code.
Im weiteren Verlauf dieses Tutorials finden Sie Codeausschnitte, die Sie an Ihre Umgebung anpassen müssen.

1- Erstellen eines Symfony Messenger-Handlers

Der Handler ist die Klasse, die den asynchron ausgeführten PHP-Code enthält. Hier platzieren Sie die Geschäftslogik, die im Hintergrund ausgeführt werden soll.

<?php
namespace App\MessageHandler;

use App\Message\CheckMessageRead;
use App\Repository\MessageRepository;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
use Symfony\Component\Notifier\NotifierInterface;
Use Doctrine\ORM\EntityManagerInterface;

#[AsMessageHandler]
class CheckMessageReadHandler {

  public function __construct(private MessageRepository $messageRepository, private NotifierInterface $notifier, private EntityManagerInterface $em) {
  }

  public function __invoke(CheckMessageRead $messageCheck): void {
  	// votre logique metier.
  }
  
}

2- Erstellen des Datencontainers

Diese Klasse ist das „Paket”, das die für die asynchrone Ausführung erforderlichen Daten transportiert. Es enthält alle Informationen, die der Handler für seine Arbeit benötigt. 

Die Nachricht ist wie ein Umschlag, der Anweisungen und Daten enthält, während der Handler der Postdienst ist, der diesen Umschlag bearbeitet.

<?php

namespace App\Message;

class CheckMessageRead {

  public function __construct(public readonly int $messageId, public readonly string $routeName) {
  }

  public function getMessageId() {
    return $this->messageId;
  }
  
  public function getRouteName() {
    return $this->routeName;
  }
}

3- Erstellen Sie den Datencontainer.

php bin/console debug:messenger
/etc/systemd/system/
php bin/console cache:clear --env=prod
php bin/console cache:clear --env=dev

Reconstruit les caches :

php bin/console cache:warmup 

php bin/console cache:warmup --env=prod

Profile picture for user admin Stephane K

Écrit le

Il y'a 1 Tag
Modifié
Il y'a 23 Stunden
Lädt...
WhatsApp
Habeuk Support: +49 152 108 01753
Senden