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-amqplibExemple : 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 Aussi dans la bibliothèque
Kysely TypeScript : guide complet du query builder type-safe
pybind11 pour C++ : guide complet avec exemples