Files d'attente de tâches en PHP : guide pratique complet

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

Travailler avec les files d'attente de tâches en PHP : guide pratique complet

\n\n

Dans les applications web modernes, il est souvent nécessaire d'effectuer des opérations longues ou gourmandes en ressources sans faire attendre l'utilisateur. L'envoi de campagnes email, la génération de rapports PDF, le traitement d'images, l'analyse de données — toutes ces tâches sont idéales pour un traitement asynchrone via des files d'attente de tâches. Dans cet article, nous allons détailler comment organiser le travail avec les files d'attente de tâches en PHP dans la pratique, examiner les outils populaires et écrire du code fonctionnel.

\n\n

Qu'est-ce qu'une file d'attente de tâches et pourquoi en a-t-on besoin ?

\n\n

Une file d'attente de tâches (job queue) est un mécanisme qui permet de placer des tâches dans une file d'attente et de les exécuter de manière asynchrone, en dehors du flux principal de traitement d'une requête HTTP. Au lieu d'effectuer une opération lourde de manière synchrone (par exemple, envoyer 1000 emails lors d'une inscription), vous placez simplement la tâche dans une file d'attente et renvoyez immédiatement une réponse à l'utilisateur. Un worker en arrière-plan récupère les tâches de la file d'attente et les exécute une par une.

\n\n

Principaux avantages de l'utilisation des files d'attente :

\n
    \n
  • Amélioration des performances — l'utilisateur n'attend pas la fin des opérations lourdes
  • \n
  • Résistance aux pannes — si une tâche échoue, elle retourne dans la file d'attente pour un nouveau traitement
  • \n
  • Évolutivité — vous pouvez lancer un nombre illimité de workers pour un traitement parallèle
  • \n
  • Mise en mémoire tampon de la charge — la file d'attente lisse les pics de charge sur le système
  • \n
\n\n

Outils populaires pour travailler avec les files d'attente en PHP

\n\n

1. RabbitMQ

\n

RabbitMQ est un puissant courtier de messages prenant en charge le protocole AMQP. Il est idéal pour les scénarios de routage complexes et nécessite l'installation d'un serveur dédié.

\n\n
// Installation via Composer\ncomposer require php-amqplib/php-amqplib\n\n// Envoi d'une tâche dans la file d'attente\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse PhpAmqpLib\\Connection\\AMQPStreamConnection;\nuse PhpAmqpLib\\Message\\AMQPMessage;\n\n$connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest');\n$channel = $connection->channel();\n$channel->queue_declare('email_queue', false, true, false, false);\n\n$data = json_encode([\n    'to' => 'user@example.com',\n    'subject' => 'Bonjour !',\n    'body' => 'Message de test'\n]);\n\n$msg = new AMQPMessage($data, ['delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT]);\n$channel->basic_publish($msg, '', 'email_queue');\n$channel->close();\n$connection->close();\n?>
\n\n

2. Redis + php-resque

\n

Redis est un stockage en mémoire rapide, parfait pour les files d'attente simples. php-resque est un port PHP de la bibliothèque Ruby populaire Resque.

\n\n
// Installation\ncomposer require chrisboulton/php-resque\n\n// Création d'une tâche\n<?php\nclass SendEmailJob\n{\n    public function perform()\n    {\n        $args = $this->args;\n        // Logique d'envoi d'email\n        mail($args['to'], $args['subject'], $args['body']);\n    }\n}\n\n// Ajout à la file d'attente\nResque::setBackend('localhost:6379');\nResque::enqueue('default', 'SendEmailJob', [\n    'to' => 'user@example.com',\n    'subject' => 'Bonjour',\n    'body' => 'Test'\n]);\n?>
\n\n

3. Beanstalkd

\n

Beanstalkd est un gestionnaire de files d'attente léger, rapide et fiable. Il est simple à installer et à configurer, ce qui en fait un excellent choix pour les petits projets.

\n\n
// Installation\ncomposer require pda/pheanstalk\n\n// Envoi d'une tâche\n<?php\nrequire_once 'vendor/autoload.php';\n\nuse Pheanstalk\\Pheanstalk;\n\n$pheanstalk = Pheanstalk::create('127.0.0.1:11300');\n$pheanstalk->useTube('email_tube')->put(\n    json_encode(['to' => 'user@example.com', 'subject' => 'Test']),\n    Pheanstalk::DEFAULT_PRIORITY,\n    Pheanstalk::DEFAULT_DELAY,\n    60 // TTR (time to run)                

Blogs

Book Recommendations