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. PHP RabbitMQ 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