Files d'attente de tâches pour PHP : RabbitMQ, Beanstalkd et Gearman
Dans les applications web modernes, il est souvent nécessaire d'effectuer des opérations longues ou gourmandes en ressources de manière asynchrone, sans obliger l'utilisateur à attendre une réponse. Exemples typiques : envoi de campagnes email, génération de rapports, traitement d'images, interaction avec des API externes. Pour résoudre ces problèmes en PHP, on utilise des files d'attente de tâches (job queues). Elles permettent de séparer la logique de la requête du traitement en arrière-plan, améliorant ainsi la réactivité de l'interface et la scalabilité du système.
Dans cet article, nous examinerons en détail trois outils populaires pour organiser des files d'attente en PHP : RabbitMQ, Beanstalkd et Gearman. Vous découvrirez leurs caractéristiques, leur architecture, des exemples d'utilisation et apprendrez à choisir la solution adaptée à votre projet.
1. RabbitMQ
RabbitMQ est un puissant courtier de messages implémentant le protocole AMQP (Advanced Message Queuing Protocol). Il prend en charge des scénarios de routage complexes, des échangeurs (exchanges), des files d'attente avec priorités, des accusés de réception et bien plus encore. RabbitMQ est idéal pour les architectures de microservices et les systèmes nécessitant une livraison fiable des messages.
Installation et connexion
Pour travailler avec RabbitMQ en PHP, on utilise la bibliothèque php-amqplib. Installation via Composer :
composer require php-amqplib/php-amqplibExemple : envoi d'une notification par email
Créons un producteur (expéditeur) et un consommateur (processeur) pour l'envoi en arrière-plan d'emails.
Fichier producer.php :
<?phprequire_once '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' => 'Bienvenue !', 'body' => 'Merci pour votre inscription.']);
$msg = new AMQPMessage($data, [ 'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);
$channel->basic_publish($msg, '', 'email_queue');
echo " [x] Message envoyé";
$channel->close();$connection->close();Fichier consumer.php :
<?phprequire_once '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 messages. Pour quitter, appuyez sur CTRL+C";
$callback = function ($msg) { $data = json_decode($msg->body, true); // Simulation d'envoi d'email sleep(2); echo " [x] Email envoyé à {$data['email']}"; $msg->ack();};
$channel->basic_qos(null, 1, null);$channel->basic_consume('email_queue', '', false, false, false, false, $callback);
while ($channel->is_consuming()) { $channel->wait();}
$channel->close();$connection->close();2. Beanstalkd
Beanstalkd est un gestionnaire de files d'attente léger, rapide et simple d'utilisation. Il fonctionne selon un protocole similaire à memcached et convient parfaitement aux tâches ne nécessitant pas de routage complexe. Beanstalkd prend en charge les priorités, les délais (delay) et le time-to-run (TTR).
Installation
Pour PHP, il existe le client pda/pheanstalk :
composer require pda/pheanstalkExemple : traitement d'images
Supposons que nous devions créer des miniatures pour les images téléchargées.
Fichier producer.php :
<?phprequire_once 'v Aussi dans la bibliothèque
TypeStack/class-validator TypeScript : guide complet avec exemples
Bibliothèques WebSocket Swift : Starscream et URLSessionWebSocketTask
Internationalisation (i18n) en TypeScript : guide complet
Mise en cache en Rust : Redis, Memcached et solutions intégrées
Rate Limiting en Java : bibliothèques et outils pour le contrôle des requêtes (Bucket4j, Resilience4j)