Position actuelle: Accueil> Derniers articles> Pourquoi Ignore_User_Abort ne prend-il pas effet? Résumé des FAQ et des solutions

Pourquoi Ignore_User_Abort ne prend-il pas effet? Résumé des FAQ et des solutions

gitbox 2025-06-15

Dans PHP, la fonction IGNORE_USER_ABORT () est souvent utilisée pour permettre aux scripts de continuer l'exécution après la déconnexion de l'utilisateur (comme la fermeture du navigateur ou la déconnexion du réseau). Cependant, de nombreux développeurs constateront qu'il ne prendra pas effet pendant l'utilisation, et le script est toujours terminé car l'utilisateur se déconnecte. Cet article analysera les causes de ce problème en profondeur et résumera certaines solutions courantes.


1. Qu'est-ce que l'ignore_user_abort ?

ignore_user_abort () est une fonction intégrée de PHP qui accepte un paramètre booléen. Après avoir appelé cette fonction et transmis dans True , PHP ignore l'événement de déconnexion de l'utilisateur et continue d'exécuter le script actuel jusqu'à sa fin ou quitte activement.

 <?php
ignore_user_abort(true);
echo "Le script commence à s&#39;exécuter\n";
// Supposons que certaines tâches qui prennent du temps sont effectuées
sleep(30);
echo "Fin de l&#39;exécution du script\n";
?>

Le code ci-dessus doit théoriquement continuer l'exécution même si l'utilisateur ferme le navigateur.


2. Pourquoi ignorer_user_abort ne fonctionne-t-il pas?

2.1 Limitations de l'environnement d'exploitation

Le mode d'exécution de PHP variera:

  • Mode CLI : Habituellement, il ne se termine pas car l'utilisateur est déconnecté, car il n'y a pas de concept de connexion de navigateur.

  • Mode CGI / FASTCGI : peut être limité par la configuration du serveur Web et la déconnexion de l'utilisateur ne peut pas être complètement ignorée.

  • Apache mod_php : généralement, ignore_user_abort est pris en charge, mais vous devez également faire attention à la configuration.

2.2 Tampon de sortie du script

Si le script a un tampon de sortie, le serveur ne le détecte pas à temps lorsque le navigateur est déconnecté, ce qui ne connaît pas avec précision l'événement de déconnexion, ignorant ainsi les paramètres.

Solution: éteignez ou actualisez le tampon de sortie.

 <?php
ignore_user_abort(true);
ob_end_flush(); // Éteindre la tampon de sortie
flush();        // Envoyer la sortie au navigateur
sleep(30);
?>

2.3 Limitations de configuration PHP

Max_execution_time dans la configuration PHP limitera le temps d'exécution maximum du script, et le script sera forcé de se terminer après l'heure d'arrivée.

Solution: ajustez max_execution_time ou appelez

 <?php
set_time_limit(0); // Annuler la limite de temps d&#39;exécution du script
ignore_user_abort(true);
?>

2.4 Comportement du serveur ou proxy

Certains serveurs Web ou proxy inverse (tels que Nginx) termineront de manière proactive la demande de déconnexion, ce qui fait que le processus PHP recevra un signal de terminaison.

Solution:

  • Confirmez les paramètres de délai d'expiration pour le serveur et l'agent.

  • Utilisez une file d'attente de tâches asynchrones ou un démon d'arrière-plan pour remplacer les scripts PHP à long terme.


3. Exemples d'erreur courants et utilisation correcte

Exemple d'erreur: le rinçage du tampon est ignoré

 <?php
ignore_user_abort(true);
echo "Commencer à exécuter des tâches\n";
sleep(30);
echo "Mission se termine\n";
?>

Si le navigateur est déconnecté, le script peut être interrompu car la sortie n'est pas envoyée immédiatement, ce qui n'a pas pu être surveillé du serveur.

Exemple correct: désactivez la mise en mémoire tampon et définissez un temps d'exécution illimité

 <?php
ignore_user_abort(true);
set_time_limit(0);

echo "Commencer à exécuter des tâches\n";
ob_end_flush();
flush();

sleep(30);
echo "Mission se termine\n";
?>

4. Résumé de la solution

question Solution
Le script se termine en raison de la déconnexion des utilisateurs ignore_user_abort (true)
Le temps d'exécution du script est limité set_time_limit (0)
La sortie n'est pas envoyée immédiatement, provoquant la détection de la déconnexion Éteindre la mise en mémoire tampon ob_end_flush () et appeler flush ()
Délai d'expiration du serveur ou restriction proxy Ajustez la configuration du serveur et utilisez des méthodes de tâche d'arrière-plan

5. Conclusion

ignore_user_abort () n'est pas omnipotent, en particulier dans les environnements de serveurs complexes, le simple fait d'appeler cette fonction ne peut souvent pas garantir que le script soit exécuté en continu. Ce n'est qu'en combinant un contrôle de sortie raisonnable, les paramètres du temps d'exécution et la configuration du serveur peuvent être obtenus. Dans le même temps, pour les tâches à long terme, il est recommandé d'utiliser des files d'attente de messages ou une conception de démon de fond pour améliorer la stabilité et l'évolutivité du système.


 <?php
// Démonstration d&#39;utilisation typique
ignore_user_abort(true);
set_time_limit(0);

echo "La mission commence\n";
ob_end_flush();
flush();

for ($i = 0; $i < 10; $i++) {
    // Simuler les tâches de longue date
    sleep(3);
    echo "calendrier:$i\n";
    flush();
}

echo "Achèvement de la tâche\n";
?>