Aufgabenwarteschlangen für PHP: RabbitMQ, Gearman und PhpAmqpLib

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Aufgabenwarteschlangen für PHP: RabbitMQ, Gearman und PhpAmqpLib

In modernen Webanwendungen ist die Antwortgeschwindigkeit für den Benutzer von entscheidender Bedeutung. Langwierige Vorgänge (E-Mail-Versand, PDF-Generierung, Bildverarbeitung, Daten-Parsing) sollten den Hauptausführungs-Thread nicht blockieren. Die Lösung für dieses Problem sind Aufgabenwarteschlangen (job queues). Sie ermöglichen es, Hintergrundaufgaben an Worker zu delegieren, die asynchron arbeiten.

Im PHP-Ökosystem gibt es mehrere ausgereifte Lösungen zur Organisation von Warteschlangen. Wir betrachten drei Schlüsselwerkzeuge: PhpAmqpLib (Client für RabbitMQ), Gearman und natives RabbitMQ über sein AMQP-Protokoll.



Wozu braucht man Aufgabenwarteschlangen in PHP?

Ein typisches Szenario: Ein Benutzer registriert sich auf einer Website. Das System muss:

  • Die Daten in der Datenbank speichern
  • Eine Begrüßungs-E-Mail senden
  • Einen PDF-Vertrag erstellen
  • Eine Spam-Prüfung starten

Ohne Warteschlange wartet der Benutzer auf den Abschluss aller Vorgänge. Mit einer Warteschlange:

  • Der Hauptprozess speichert die Daten und sendet die Aufgabe an die Warteschlange
  • Der Benutzer erhält sofort die Antwort „Erfolgreich“
  • Hintergrund-Worker verarbeiten die Aufgaben nacheinander

Dies verbessert die UX und die Systemstabilität.



1. RabbitMQ und PhpAmqpLib

RabbitMQ ist ein leistungsstarker Nachrichtenbroker, der das AMQP 0-9-1-Protokoll unterstützt. PhpAmqpLib ist eine reine PHP-Implementierung eines Clients für die Arbeit mit RabbitMQ ohne externe Erweiterungen.



Installation

composer require php-amqplib/php-amqplib


Beispiel: Aufgabe senden (Producer)

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();

// Warteschlange deklarieren (wird erstellt, falls nicht vorhanden)$channel->queue_declare('email_queue', false, true, false, false);

$data = json_encode([ 'to' => 'user@example.com', 'subject' => 'Begrüßung', 'body' => 'Willkommen!']);

$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'email_queue');

echo " [x] Gesendet: $data";

$channel->close();$connection->close();


Beispiel: Worker (Consumer)

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\\Connection\\AMQPStreamConnection;

$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();

$channel->queue_declare('email_queue', false, true, false, false);

echo " [*] Warte auf Aufgaben. Zum Beenden drücken Sie STRG+C";

$callback = function ($msg) { $data = json_decode($msg->body, true); // E-Mail-Versand simulieren echo " [x] Sende E-Mail an {$data['to']}: {$data['subject']}"; sleep(2); // Arbeit simulieren echo " [x] Fertig"; $msg->ack(); // Verarbeitungsbestätigung};

$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) { $channel->wait();}


Vorteile: Zuverlässigkeit, Unterstützung komplexer Routings (topics, headers), Nachrichtenpersistenz, Clustering.

Nachteile: Installation und Konfiguration eines RabbitMQ-Servers erforderlich (Erlang, Verwaltung über Web-Interface).



2. Gearman

Gearman ist ein System für verteilte Aufgaben. Es besteht aus drei Komponenten: Client (sendet Aufgaben), Worker (führt aus), Server (Dispatcher). Es arbeitet über ein binäres Protokoll.



Installation

Installieren Sie zuerst den Gearman-Server und die PHP-Erweiterung:

sudo apt-get install gearman-job-s                    

Empfehlungen