Files d'attente de tâches en PHP : guide de mise en œuvre et d'optimisation

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 : du simple au complexe



Dans les applications web modernes, il est souvent nécessaire d'effectuer des opérations gourmandes en ressources ou de longue durée sans faire attendre l'utilisateur. Envoi de notifications par e-mail, génération de rapports, traitement d'images, intégration avec des API externes — toutes ces tâches sont idéales pour une exécution asynchrone. C'est là que les files d'attente de tâches viennent à la rescousse. Dans cet article, nous examinerons en détail comment implémenter et optimiser le travail avec les files d'attente en PHP, en commençant par des solutions simples pour finir avec des outils de qualité industrielle.



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



Une file d'attente de tâches est un mécanisme qui permet de reporter l'exécution d'un travail à plus tard. Au lieu d'exécuter une tâche immédiatement dans une requête HTTP, vous la placez dans une file d'attente. Un worker spécial ou un groupe de workers récupère les tâches de la file et les traite en arrière-plan.



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

  • Réponse plus rapide à l'utilisateur : L'utilisateur reçoit une réponse immédiatement, tandis que le travail lourd est effectué de manière asynchrone.
  • Scalabilité : Vous pouvez exécuter plusieurs workers pour le traitement parallèle des tâches.
  • Fiabilité : Si une tâche échoue (par exemple, en raison d'une erreur temporaire), elle peut être réessayée plus tard.
  • Déchargement du serveur principal : Les processus en arrière-plan ne bloquent pas le traitement des nouvelles requêtes HTTP.


File d'attente simple basée sur une base de données



La façon la plus simple d'organiser une file d'attente en PHP est d'utiliser une table de base de données (par exemple, MySQL). Cette approche ne nécessite pas l'installation de logiciels supplémentaires et est parfaite pour les petits projets.



Étape 1 : Création de la table jobs

CREATE TABLE jobs (    id INT AUTO_INCREMENT PRIMARY KEY,    queue_name VARCHAR(255) DEFAULT 'default',    payload TEXT NOT NULL,    status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    available_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,    attempts INT DEFAULT 0);


Étape 2 : Ajout d'une tâche à la file d'attente

function addJob(string $queueName, array $data): void {    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');    $stmt = $pdo->prepare(        "INSERT INTO jobs (queue_name, payload, available_at)          VALUES (?, ?, NOW())"    );    $stmt->execute([$queueName, json_encode($data)]);}

// Exemple d'utilisationaddJob('emails', ['to' => 'user@example.com', 'subject' => 'Bonjour !']);


Étape 3 : Création d'un worker (worker.php)

// Boucle infinie pour traiter les tâcheswhile (true) {    $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');        // Récupérer une tâche avec verrouillage de ligne    $stmt = $pdo->prepare(        "SELECT * FROM jobs          WHERE status = 'pending' AND available_at <= NOW()          ORDER BY id ASC          LIMIT 1 FOR UPDATE"    );    $stmt->execute();    $job = $stmt->fetch(PDO::FETCH_ASSOC);        if ($job) {        // Marquer comme "en cours de traitement"        $updateStmt = $pdo->prepare("UPDATE jobs SET status = 'processing' WHERE id = ?");        $updateStmt->execute([$job['id']]);                try {            // Exécuter la tâche            $data = json_decode($job['payload'], true);            processJob($data);                        // Marquer comme terminée            $pdo->prepare("UPDATE jobs SET status = 'completed' WHERE id = ?")                ->execute([$job['id']]);        } catch (Exception $e) {            // Gestion des erreurs            $attempts = $job['attempts'] + 1;            if ($attempts < 3) {                

Blogs

Book Recommendations