Aufgabenwarteschlangen für PHP: RabbitMQ, Gearman und Redis

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 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-amqplib


Beispiel: 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 gearman


Beispiel: 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

Empfehlungen