1. Avant le tutoriel
Veuillez lire les sections suivantes d'abord pour comprendre les connaissances pertinentes
- Concepts de base de RabbitMQ
- Principe du motif de sujet RabbitMQ
- Chapitre de Démarrage Rapide de RabbitMQ en PHP (obligatoire, car les chapitres ultérieurs ne dupliqueront pas le code, ils montreront uniquement le code clé)
- Chapitre de Motif de Publication/Abonnement de RabbitMQ en PHP (obligatoire, car le code est presque le même, seuls le type d'échange et les paramètres de routage sont différents)
2.Définir l'échange de sujet
// Déclarer l'échange
$channel->exchange_declare(
'tizi365.topic', // Nom de l'échange, doit être unique, ne peut pas être répété
'topic', // Type d'échange
false,
false, // S'il est durable
false
);
Remarque : Les producteurs de messages et les consommateurs ont besoin d'échanges.
3.Envoyer un message
Nous envoyons des messages à l'échange, et l'échange les distribue à la file d'attente correspondante en fonction des règles de routage.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Créer une connexion rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Créer un canal
$channel = $connection->channel();
// Déclarer l'échange
$channel->exchange_declare(
'tizi365.topic', // Nom de l'échange, doit être unique, ne peut pas être répété
'topic', // Type d'échange
false,
false, // S'il est durable
false
);
// Objet de message, le paramètre est le contenu du message
$msg = new AMQPMessage("bonjour tizi365.com");
// Envoyer le message
// Notez le troisième paramètre, le paramètre de routage
$channel->basic_publish(
$msg, // Objet de message
'tizi365.topic', // Nom de l'échange
"www.tizi365.com" // Paramètre de routage, peut être défini arbitrairement selon les besoins
);
echo ' [x] Envoyé ', $msg->getBody(), "\n";
// Libérer les ressources
$channel->close();
$connection->close();
4. Recevoir un message
4.1. Définir la file d'attente et lier l'échange
Pour consommer les messages de la file d'attente, vous devez d'abord définir une file d'attente, puis lier la file d'attente à l'échange cible.
// Déclarer une file d'attente anonyme
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Lier la file d'attente à l'échange spécifié
$channel->queue_bind(
$queue_name, // Nom de la file d'attente
'tizi365.topic', // Nom de l'échange
"*.tizi365.com" // Paramètre de routage de liaison, ici en utilisant le joker * (astérisque), qui peut correspondre à un seul mot
Remarque : Tous les paramètres de routage utilisent le joker * (astérisque), qui peut correspondre à un seul mot. S'ils sont modifiés en # (dièse), ils peuvent correspondre à plusieurs mots.
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
// Créer une connexion rabbitmq
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Créer un canal
$channel = $connection->channel();
// Déclarer un échange
$channel->exchange_declare(
'tizi365.topic', // Nom de l'échange, doit être unique et ne peut pas être répété
'topic', // Type d'échange
false,
false, // Qu'il soit durable
false
);
// Déclarer une file d'attente anonyme
list($queue_name, ,) = $channel->queue_declare("", false, false, true, false);
// Lier la file d'attente à l'échange spécifié
$channel->queue_bind(
$queue_name, // Nom de la file d'attente
'tizi365.topic', // Nom de l'échange
"*.tizi365.com" // Clé de routage de liaison, en utilisant ici le joker * qui peut correspondre à un seul mot
);
echo " [*] En attente du message. Pour quitter, appuyez sur CTRL+C\n";
// Définir la fonction de traitement des messages (en utilisant une fonction anonyme ici)
$callback = function ($msg) {
// Logique de traitement des messages
echo ' [x] ', $msg->body, "\n";
};
// Créer un consommateur
$channel->basic_consume(
$queue_name, // Nom de la file d'attente à consommer
'', // Tag du consommateur, s'il est ignoré, un ID unique sera généré automatiquement
false,
true, // S'il faut automatiquement reconnaître le message, c'est-à-dire dire automatiquement à rabbitmq que le message a été traité avec succès
false,
false,
$callback // Fonction de traitement des messages
);
// Si le canal n'est pas fermé, bloquez le processus pour éviter la sortie du processus
while ($channel->is_open()) {
$channel->wait();
}
// Libérer les ressources
$channel->close();
$connection->close();
Étant donné que le paramètre de routage défini lors de la liaison de l'échange est *.tizi365.com, il correspond au paramètre de routage du message (www.tizi365.com), donc le message peut être reçu.