Le mode de file d'attente le plus simple de PHP RabbitMQ se compose d'un producteur et d'un consommateur, comme le montre l'architecture ci-dessous.
Explication :
P représente le producteur, C représente le consommateur, et le rouge représente la file d'attente.
Actuellement, lors de l'utilisation de RabbitMQ avec PHP, le package recommandé par l'officiel est php-amqplib.
1. Pre-tutoriel
Veuillez lire d'abord les sections suivantes pour comprendre les connaissances pertinentes :
2. Installer les dépendances PHP
Utilisez composer pour installer :
composer require php-amqplib/php-amqplib
Remarque : La version la plus récente de php-amqplib nécessite PHP 7.0 ou supérieur.
Importer le package php-amqplib :
require_once __DIR__ . '/vendor/autoload.php';
3. Envoyer un message
3.1. Créer une connexion RabbitMQ
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
Explication des paramètres :
- new AMQPStreamConnection('adresse du serveur RabbitMQ', numéro de port, 'nom d'utilisateur', 'mot de passe');
3.2. Créer un canal
$channel = $connection->channel();
La plupart des opérations sont effectuées dans le canal.
3.3. Déclarer une file d'attente
$channel->queue_declare(
'tizi365_hello', // Nom de la file d'attente, doit être unique
false,
true, // Si elle est durable
false,
false
);
3.4. Envoyer un message
// Définir un objet message, le paramètre est le contenu du message que nous devons envoyer
$msg = new AMQPMessage('Bonjour le monde !');
// Si le message est durable
// $msg->set('delivery_mode', AMQPMessage::DELIVERY_MODE_PERSISTENT);
// Envoyer le message
$channel->basic_publish(
$msg, // Objet message
'', // Ignorer l'échange
'tizi365_hello' // Paramètre de routage, utiliser le nom de la file d'attente comme paramètre de routage ici
);
3.5. Code complet d'envoi de message en PHP
<?php
require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Connection\AMQPStreamConnection;
use PhpAmqpLib\Message\AMQPMessage;
// Créer une connexion
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');
// Créer un canal
$channel = $connection->channel();
// Déclarer une file d'attente
$channel->queue_declare('tizi365_hello', false, false, false, false);
// Définir un objet message
$msg = new AMQPMessage('Bonjour le monde !');
// Envoyer le message
$channel->basic_publish($msg, '', 'tizi365_hello');
echo " [x] Sent 'Bonjour le monde !'\n";
$channel->close();
$connection->close();
Enregistrez dans le fichier : send.php
4. Consommation des messages
Les trois premières étapes de la consommation des messages (création d'une connexion RabbitMQ, création d'un canal, déclaration d'une file d'attente) sont identiques à l'envoi des messages, correspondant aux sections 3.1, 3.2 et 3.3, respectivement.
Le code complet du consommateur est le suivant :
<?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 une file d'attente
$channel->queue_declare('tizi365_hello', false, false, false, false);
echo " [*] En attente des messages. Pour sortir, appuyez sur CTRL+C\n";
// Définir la fonction de traitement des messages (utilisation d'une fonction anonyme ici)
$callback = function ($msg) {
// Logique de traitement du message
echo ' [x] Reçu ', $msg->body, "\n";
};
// Créer un consommateur
$channel->basic_consume(
'tizi365_hello', // Nom de la file d'attente à consommer
'', // Tag du consommateur, s'il est ignoré, un ID unique est généré
false,
true, // S'il faut acknowledger automatiquement 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é, bloquer le processus pour l'empêcher de se terminer
while ($channel->is_open()) {
$channel->wait();
}
// Libérer les ressources
$channel->close();
$connection->close();
Enregistrer dans le fichier : recv.php
5. Exécution de la démo
Ouvrez deux fenêtres de terminal et exécutez les deux scripts séparément :
php recv.php
php send.php