Files d'attente et tâches en arrière-plan PHP : accélérez votre site

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

Comment éviter que votre site PHP ne « plante » sur des opérations longues ?

\n\n

Avez-vous déjà attendu 30 secondes qu'un site envoie un email de confirmation ? Ou observé une page « bloquer » lors de la génération d'un rapport PDF ? Dans le monde PHP, où chaque requête est généralement exécutée de manière synchrone, de telles tâches peuvent ruiner l'expérience utilisateur. Mais il existe une solution éprouvée : les files d'attente et les tâches en arrière-plan. Elles permettent de déplacer le travail « lourd » en coulisses, tout en affichant instantanément à l'utilisateur : « Votre demande a été prise en compte ! ».

\n\n

Dans cet article, nous allons voir comment organiser des files d'attente en PHP avec des outils populaires : RabbitMQ, Redis et Gearman. Vous découvrirez des exemples de code concrets, apprendrez à éviter les erreurs courantes, et pourrez mettre en place un traitement en arrière-plan sur votre projet dès aujourd'hui.

\n\n

Pourquoi utiliser des files d'attente en PHP ?

\n\n

PHP fonctionne traditionnellement selon le modèle « requête-réponse ». Mais lorsqu'il s'agit d'opérations qui durent plus de 1 à 2 secondes (envoi d'email, traitement d'images, génération de rapports, webhooks), l'utilisateur est confronté à des time-outs ou s'ennuie simplement en regardant un spinner. Les files d'attente résolvent ce problème de manière radicale :

\n\n
    \n
  • Réponse instantanée — l'utilisateur reçoit immédiatement une réponse, tandis que la tâche lourde part en arrière-plan.
  • \n
  • Passage à l'échelle — vous pouvez exécuter des dizaines de workers en parallèle, sans modifier le code.
  • \n
  • Fiabilité — si un worker « tombe », la tâche reste dans la file d'attente et sera exécutée plus tard.
  • \n
  • Équilibrage de charge — les pics de charge sont lissés grâce à la mise en mémoire tampon.
  • \n
\n\n

Voyons comment mettre cela en pratique, en utilisant trois approches très populaires.

\n\n

1. Files d'attente avec Redis : simple et rapide

\n\n

Redis n'est pas qu'un simple cache. Grâce à ses structures de données (listes, ensembles) et au mécanisme Pub/Sub, il est parfait pour des files d'attente simples. Si vous avez déjà Redis sur votre serveur, c'est le moyen le plus rapide d'implémenter des tâches en arrière-plan sans installer de services supplémentaires.

\n\n

Exemple : file d'attente d'envoi d'emails avec Redis

\n\n

Supposons qu'après l'inscription d'un utilisateur, vous deviez envoyer un email de bienvenue. Au lieu d'appeler mail() dans le contrôleur, nous plaçons simplement la tâche dans la file d'attente.

\n\n

Étape 1. Ajouter une tâche à la file d'attente (producteur) :

\n\n
<?php\n// producer.php\n$redis = new Redis();\n$redis->connect('127.0.0.1', 6379);\n\n$task = json_encode([\n    'type' => 'welcome_email',\n    'user_id' => 42,\n    'email' => 'user@example.com',\n    'created_at' => time()\n]);\n\n// RPUSH ajoute un élément à la fin de la liste\n$redis->rPush('email_queue', $task);\necho "Tâche ajoutée à la file d'attente\\n";\n?>
\n\n

Étape 2. Worker qui traite les tâches (consommateur) :

\n\n
<?php\n// worker.php\n$redis = new Redis();\n$redis->connect('127.0.0.1', 6379);\n\necho "Worker démarré, en attente de tâches...\\n";\n\nwhile (true) {\n    // BLPop bloque l'exécution jusqu'à l'apparition d'un élément\n    $taskData = $redis->blPop('email_queue', 5); // timeout de 5 sec\n    \n    if ($taskData) {\n        $task = json_decode($taskData[1], true);\n        \n        echo "Traitement de la tâche : {$task['type']} pour {$task['email']}\\n";\n        \n        // Simulation d'envoi d'email\n        sleep(2);\n        \n        // Ici, la logique réelle : mail(), SMTP, etc.\n        echo "Email envoyé à l'utilisateur {$task['user_id']}\\n";\n    }\n}\n?>
\n\n

Lancement :

\n

Le worker est lancé en arrière-plan (via nohup ou Supervisor) :

\n
php worker.php &
\n\n

Maintenant, lorsqu'un utilisateur s'inscrit, le contrôleur appelle producer.php et renvoie immédiatement une réponse, tandis que le worker traite les emails tranquillement. Redis garantit que la tâche ne sera pas perdue, même si le worker tombe temporairement.

\n\n

2. RabbitMQ : le standard industriel

\n\n

Si votre projet prend de l'ampleur

Blogs

Book Recommendations