Aufgabenwarteschlangen für PHP: RabbitMQ, Gearman und Redis
In modernen PHP-Webanwendungen besteht häufig die Notwendigkeit, langwierige oder ressourcenintensive Operationen ohne Blockierung des Hauptbenutzer-Threads auszuführen. Das Versenden von E-Mail-Newslettern, das Generieren von Berichten, die Bildverarbeitung, die Arbeit mit Videos – all diese Aufgaben sollten besser asynchron im Hintergrund erledigt werden. Dafür gibt es Aufgabenwarteschlangen (Job Queues) – Mechanismen, die es ermöglichen, die Ausführung einer Aufgabe zu verschieben und später mit Hilfe von Workern zu verarbeiten.
In diesem Artikel betrachten wir drei beliebte Werkzeuge zur Organisation von Aufgabenwarteschlangen in PHP: RabbitMQ, Gearman und Redis. Sie erfahren, in welchen Fällen Sie sie einsetzen sollten, und sehen Codebeispiele.
Wozu braucht man Aufgabenwarteschlangen?
Die wichtigsten Vorteile der Verwendung von Warteschlangen:
- Asynchronität – der Benutzer wartet nicht auf den Abschluss einer schweren Operation.
- Skalierbarkeit – Sie können viele Worker für die parallele Verarbeitung starten.
- Fehlertoleranz – wenn ein Worker ausfällt, bleibt die Aufgabe in der Warteschlange und wird später verarbeitet.
- Trennung der Verantwortlichkeiten – der Code zum Senden einer Aufgabe und der Code zu deren Verarbeitung sind lose gekoppelt.
1. RabbitMQ – leistungsstarker Message Broker
RabbitMQ ist ein vollwertiger Message Broker, der das AMQP-Protokoll unterstützt. Er bietet garantierte Zustellung, Routing, Bestätigungen und vieles mehr. Geeignet für komplexe Systeme mit hoher Last.
Für die Arbeit mit RabbitMQ in PHP wird die Erweiterung php-amqplib verwendet.
Installation
composer require php-amqplib/php-amqplibBeispiel: Aufgabe senden
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode(['email' => 'user@example.com', 'subject' => 'Hallo!']);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');echo "Aufgabe in die Warteschlange gestellt";
$channel->close();$connection->close();Beispiel: Worker (Verarbeiter)
<?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);
$callback = function ($msg) { $data = json_decode($msg->body, true); echo "Sende E-Mail an {$data['email']} mit Betreff '{$data['subject']}'"; // Hier die tatsächliche E-Mail-Versendung $msg->ack(); // Bestätigung der Verarbeitung};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}2. Gearman – verteiltes Aufgabensystem
Gearman ist spezialisiert auf die verteilte Verarbeitung von Aufgaben. Es ermöglicht das Aufrufen von Funktionen auf entfernten Servern oder im Hintergrundmodus. Ideal für eine Microservices-Architektur.
Für PHP gibt es die Erweiterung gearman (PECL).
Installation
sudo apt install gearman-job-serverpecl install gearmanBeispiel: Client (Aufgabe senden)
<?php$client = new GearmanClient();$client->addServer('127.0.0.1', 4730);
$result = $client->doBackground('send_email', json_encode([ 'email' => 'user@example.com', 'subject' => 'Hallo!']));
echo "Aufgabe gesendet