Files d'attente de tâches pour PHP : RabbitMQ, Gearman et Redis
Dans les applications web modernes en PHP, il est souvent nécessaire d'effectuer des opérations longues ou gourmandes en ressources sans bloquer le flux principal de l'utilisateur. L'envoi de campagnes email, la génération de rapports, le traitement d'images, le travail avec des vidéos — toutes ces tâches sont mieux exécutées de manière asynchrone, en arrière-plan. Pour cela, il existe des files d'attente de tâches (job queues) — des mécanismes qui permettent de différer l'exécution d'une tâche et de la traiter plus tard à l'aide de workers.
Dans cet article, nous examinerons trois outils populaires pour organiser des files d'attente de tâches en PHP : RabbitMQ, Gearman et Redis. Vous apprendrez dans quels cas les utiliser et verrez des exemples de code.
Pourquoi des files d'attente de tâches ?
Les principaux avantages de l'utilisation de files d'attente :
- Asynchronisme — l'utilisateur n'attend pas la fin d'une opération lourde.
- Mise à l'échelle — vous pouvez lancer plusieurs workers pour un traitement parallèle.
- Tolérance aux pannes — si un worker tombe, la tâche reste dans la file d'attente et sera traitée plus tard.
- Séparation des responsabilités — le code d'envoi de la tâche et le code de son traitement sont faiblement couplés.
1. RabbitMQ — un puissant courtier de messages
RabbitMQ est un courtier de messages complet prenant en charge le protocole AMQP. Il assure une livraison garantie, le routage, les accusés de réception et bien plus encore. Il convient aux systèmes complexes à forte charge.
Pour travailler avec RabbitMQ en PHP, on utilise l'extension php-amqplib.
Installation
composer require php-amqplib/php-amqplibExemple : envoi d'une tâche
<?phprequire_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\\Connection\\AMQPStreamConnection;use PhpAmqpLib\\Message\\AMQPMessage;
$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');$channel = $connection->channel();
$channel->queue_declare('email_queue', false, true, false, false);
$data = json_encode(['email' => 'user@example.com', 'subject' => 'Bonjour !']);$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');echo "Tâche envoyée dans la file d'attente";
$channel->close();$connection->close();Exemple : worker (gestionnaire)
<?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);
$callback = function ($msg) { $data = json_decode($msg->body, true); echo "Envoi d'un email à {$data['email']} avec le sujet '{$data['subject']}'"; // Ici, l'envoi réel de l'email $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();}2. Gearman — système de tâches distribué
Gearman est spécialisé dans le traitement distribué des tâches. Il permet d'appeler des fonctions sur des serveurs distants ou en arrière-plan. Il est parfaitement adapté à une architecture de microservices.
Pour PHP, il existe l'extension gearman (PECL).
Installation
sudo apt install gearman-job-serverpecl install gearmanExemple : client (envoi d'une tâche)
<?php$client = new GearmanClient();$client->addServer('127.0.0.1', 4730);
$result = $client->doBackground('send_email', json_encode([ 'email' => 'user@example.com', 'subject' => 'Bonjour !']));
echo "Tâche envoyée Aussi dans la bibliothèque
Parsing HTML en Go (Golang) : bibliothèques et exemples de code
Chai pour JavaScript (Node.js) : guide complet avec exemples
Travailler avec Markdown en Swift (iOS/macOS) : bibliothèques Down, SwiftMarkdown
Journalisation en Rust : aperçu des meilleures bibliothèques et solutions pour votre projet