Position actuelle: Accueil> Derniers articles> Utilisez IGNORE_USER_ABORT dans les tâches de longue date pour éviter les délais d'attente du script PHP

Utilisez IGNORE_USER_ABORT dans les tâches de longue date pour éviter les délais d'attente du script PHP

gitbox 2025-05-29

Lorsque vous utilisez PHP pour effectuer des tâches à long terme, nous rencontrons souvent une situation où l'utilisateur ferme le navigateur ou déconnecte activement la demande, et le script PHP sera interdit. Ceci est très fatal pour les scripts qui nécessitent une course à long terme ou un traitement continu du backend. Alors, comment empêcher le script d'être interdit lorsque l'utilisateur est déconnecté? La réponse consiste à utiliser la fonction ignore_user_abort () .

Qu'est-ce que l'ignore_user_abort?

Ignore_user_abort () est une fonction fournie par PHP pour définir si le script continue d'exécuter lorsque le client se déconnecte.

 ignore_user_abort(true);

Lorsqu'un véritable paramètre est passé, le script PHP continuera d'exécuter même si l'utilisateur ferme le navigateur jusqu'à ce que l'exécution soit terminée ou chronométrée / sort activement.

Scénarios d'application d'ignore_user_abort

  • Gérer les tâches asynchrones

  • Traitement de la file d'attente de fond

  • Exécution de la simulation de tâche chronométrée

  • Génération de fichiers ou exportation des mégadonnées

  • Les opérations dans les coulisses qui ont besoin de maintenir la cohérence de l'État

Pour donner un exemple pratique, si vous développez une fonction de sauvegarde du système, une fois l'utilisateur cliqué sur "Démarrer la sauvegarde", le script doit s'exécuter pendant plus de dix minutes. Si l'utilisateur ferme le navigateur, le script sera interdit par défaut et la tâche de sauvegarde échouera. Et via IGNORE_USER_ABORT (true) , même si l'utilisateur quitte la page, le script continuera d'être exécuté sur le serveur jusqu'à la fin de la sauvegarde.

Comment utiliser ignore_user_abort

Voici un exemple de code de traitement des tâches longs typique:

 <?php
ignore_user_abort(true); // Continuer l&#39;exécution même si l&#39;utilisateur rompt la connexion
set_time_limit(0); // Annuler la limite de temps d&#39;exécution du script

file_put_contents('log.txt', "Heure de début de la mission:" . date('Y-m-d H:i:s') . "\n", FILE_APPEND);

// Simuler une tâche à long terme
for ($i = 1; $i <= 10; $i++) {
    file_put_contents('log.txt', "1 et 1 {$i} Exécution étape par étape...\n", FILE_APPEND);
    sleep(5); // Long pour chaque étape de la simulation
}

file_put_contents('log.txt', "Temps d&#39;achèvement de la tâche:" . date('Y-m-d H:i:s') . "\n", FILE_APPEND);
?>

Vous pouvez appeler ce script via des demandes Curl ou Ajax, par exemple:

 fetch("https://gitbox.net/run-task.php");

Même si l'utilisateur ferme le navigateur après avoir envoyé la demande, le script sera exécuté en totalité.

Vérifier l'état de la connexion

Si vous souhaitez effectuer un traitement logique après la déconnexion de l'utilisateur, comme écrire des journaux ou abandonner certains comportements, vous pouvez utiliser la fonction Connection_Aborted () pour détecter:

 if (connection_aborted()) {
    file_put_contents('log.txt', "La connexion utilisateur a été interrompue\n", FILE_APPEND);
}

Utilisé avec IGNORE_USER_ABORT (true) , vous pouvez gérer plus de manière flexible les interruptions et les non-interruptions.

Choses à noter

  • L'utilisation d'ignore_user_abort () ne signifie pas que vous pouvez ignorer toutes les exceptions, les interruptions peuvent également provenir du côté serveur (comme Nginx, APACHE Configuration) ou le script PHP lui-même (comme la limite de mémoire).

  • Il est recommandé d'utiliser set_time_limit (0) en même temps pour annuler la limite de temps d'exécution maximale.

  • Si le script fournit des données au client, essayez d'utiliser ob_start () pour activer la mise en mémoire tampon avant la logique pour éviter les problèmes de connexion causés par le comportement de sortie.

Résumer

Lorsque vous gérez de longues tâches dans PHP, l'utilisation de l'ignore_user_abort (true) est un moyen efficace de s'assurer que le script n'est pas interrompu par l'utilisateur au milieu. Il peut garantir que les tâches sont entièrement exécutées du côté du serveur et améliorer la stabilité et la fiabilité du système. Il s'agit d'une astuce très pratique pour les scripts de fond impliquant des tâches telles que la sauvegarde, la poussée, l'exportation, etc.