Der einfachste Warteschlangenmodus von PHP RabbitMQ besteht aus einem Produzenten und einem Konsumenten, wie in der folgenden Architektur dargestellt. PHP RabbitMQ Erklärung: P steht für den Produzenten, C für den Konsumenten und rot für die Warteschlange.

Derzeit wird für die Verwendung von RabbitMQ mit PHP das offiziell empfohlene Paket php-amqplib verwendet.

1. Vorbereitung

Bitte lesen Sie zuerst die folgenden Abschnitte, um das relevante Wissen zu verstehen:

2. PHP-Abhängigkeiten installieren

Verwenden Sie Composer zur Installation:

composer require php-amqplib/php-amqplib

Hinweis: Die neueste Version von php-amqplib erfordert PHP 7.0 oder höher.

Importieren Sie das php-amqplib-Paket:

require_once __DIR__ . '/vendor/autoload.php';

3. Nachricht senden

3.1. Verbindung zu RabbitMQ herstellen

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

Erklärung der Parameter:

  • new AMQPStreamConnection('RabbitMQ-Serveradresse', Portnummer, 'Benutzername', 'Passwort');

3.2. Kanal erstellen

$channel = $connection->channel();

Die meisten Operationen werden im Kanal durchgeführt.

3.3. Warteschlange deklarieren

$channel->queue_declare(
	'tizi365_hello',  // Warteschlangenname, muss eindeutig sein
	false,
	true, // Ob sie beständig ist
	false,
	false
);

3.4. Nachricht senden

// Definieren Sie ein Nachrichtenobjekt, wobei der Parameter den zu sendenden Nachrichteninhalt darstellt
$msg = new AMQPMessage('Hallo Welt!');
// Ob die Nachricht beständig ist
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);

// Nachricht senden
$channel->basic_publish(
		$msg, // Nachrichtenobjekt
		'',   // Tausch ignorieren
		'tizi365_hello' // Routing-Parameter, hier den Warteschlangennamen als Routing-Parameter verwenden
	);

3.5. Vollständiger PHP-Code zum Senden von Nachrichten

<?php 
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;

// Verbindung herstellen
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Kanal erstellen
$channel = $connection->channel();
// Warteschlange deklarieren
$channel->queue_declare('tizi365_hello', false, false, false, false);

// Nachrichtenobjekt definieren
$msg = new AMQPMessage('Hallo Welt!');
// Nachricht senden
$channel->basic_publish($msg, '', 'tizi365_hello');

echo " [x] Sent 'Hallo Welt!'\n";

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

Speichern in Datei: send.php

4. Nachrichtenverarbeitung

Die ersten drei Schritte zur Nachrichtenverarbeitung (Erstellen einer RabbitMQ-Verbindung, Erstellen eines Kanals, Deklarieren einer Warteschlange) sind identisch mit dem Versenden von Nachrichten und entsprechen den Abschnitten 3.1, 3.2 und 3.3, jeweils.

Der vollständige Code des Empfängers sieht wie folgt aus:

<?php require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;

// Eine RabbitMQ-Verbindung herstellen
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Einen Kanal erstellen
$channel = $connection->channel();

// Eine Warteschlange deklarieren
$channel->queue_declare('tizi365_hello', false, false, false, false);

echo " [*] Warten auf Nachrichten. Zum Beenden CTRL+C drücken\n";

// Die Funktion zur Nachrichtenverarbeitung definieren (hier wird eine anonyme Funktion verwendet)
$callback = function ($msg) {
    // Logik zur Nachrichtenverarbeitung
    echo ' [x] Empfangen: ', $msg->body, "\n";
};

// Einen Verbraucher erstellen
$channel->basic_consume(
    'tizi365_hello', // Zu konsumierender Warteschlangenname
    '', // Verbraucher-Tag, falls ignoriert, wird eine eindeutige ID generiert
    false,
    true, // Ob die Nachricht automatisch bestätigt werden soll, d.h. ob automatisch RabbitMQ mitgeteilt werden soll, dass die Nachricht erfolgreich verarbeitet wurde
    false,
    false,
    $callback // Funktion zur Nachrichtenverarbeitung
);

// Solange der Kanal nicht geschlossen ist, den Prozess blockieren, um ein Beenden zu verhindern
while ($channel->is_open()) {
    $channel->wait();
}

// Ressourcen freigeben
$channel->close();
$connection->close();

In Datei speichern: recv.php

5. Ausführen der Demo

Öffnen Sie zwei Shell-Fenster und führen Sie die beiden Skripte separat aus:

php recv.php

php send.php