Files d'attente de tâches pour PHP : RabbitMQ, Gearman et PhpAmqpLib

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Files d'attente de tâches pour PHP : RabbitMQ, Gearman et PhpAmqpLib

Dans les applications web modernes, la vitesse de réponse à l'utilisateur est cruciale. Les opérations longues (envoi d'email, génération de PDF, traitement d'images, analyse de données) ne doivent pas bloquer le flux d'exécution principal. La solution à ce problème est les files d'attente de tâches (job queues). Elles permettent de déléguer les tâches d'arrière-plan à des workers qui travaillent de manière asynchrone.

Dans l'écosystème PHP, il existe plusieurs solutions matures pour organiser les files d'attente. Examinons trois outils clés : PhpAmqpLib (client pour RabbitMQ), Gearman et le RabbitMQ natif via son protocole AMQP.



Pourquoi des files d'attente de tâches en PHP ?

Scénario typique : un utilisateur s'inscrit sur un site. Le système doit :

  • Enregistrer les données dans la base de données
  • Envoyer un email de bienvenue
  • Créer un contrat PDF
  • Lancer une vérification anti-spam

Sans file d'attente, l'utilisateur attend la fin de toutes les opérations. Avec une file d'attente :

  • Le processus principal enregistre les données et envoie la tâche dans la file
  • L'utilisateur reçoit instantanément une réponse « Succès »
  • Les workers d'arrière-plan traitent les tâches une par une

Cela améliore l'UX et la stabilité du système.



1. RabbitMQ et PhpAmqpLib

RabbitMQ est un puissant courtier de messages prenant en charge le protocole AMQP 0-9-1. PhpAmqpLib est une implémentation purement PHP d'un client pour travailler avec RabbitMQ sans extensions externes.



Installation

composer require php-amqplib/php-amqplib


Exemple : Envoi d'une tâche (Producer)

<?phprequire_once __DIR__ . '/vendor/autoload.php';

use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;

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

// Déclare la file d'attente (sera créée si elle n'existe pas)$channel->queue_declare('email_queue', false, true, false, false);

$data = json_encode([ 'to' => 'user@example.com', 'subject' => 'Bienvenue', 'body' => 'Bienvenue !']);

$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);$channel->basic_publish($msg, '', 'email_queue');

echo " [x] Envoyé : $data";

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


Exemple : Worker (Consumer)

<?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);

echo " [*] En attente de tâches. Pour quitter, appuyez sur CTRL+C";

$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulation d'envoi d'email echo " [x] Envoi d'un email à {$data['to']} : {$data['subject']}"; sleep(2); // Simulation de travail echo " [x] Terminé"; $msg->ack(); // Accusé de réception du traitement};

$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);

while ($channel->is_consuming()) { $channel->wait();}


Avantages : fiabilité, prise en charge des routages complexes (topics, headers), persistance des messages, clustering.

Inconvénients : nécessite l'installation et la configuration du serveur RabbitMQ (Erlang, gestion via interface web).



2. Gearman

Gearman est un système de tâches distribuées. Il se compose de trois composants : le client (envoie les tâches), le worker (exécute), le serveur (répartiteur). Il fonctionne via un protocole binaire.



Installation

Installez d'abord le serveur Gearman et l'extension PHP :

sudo apt-get install gearman-job-s                    

Recommendations