Problème
J'ai un formulaire qui, une fois soumis, exécutera un code de base pour traiter les informations soumises et l'insérer dans une base de données pour l'afficher sur un site Web de notification. De plus, j'ai une liste de personnes qui se sont inscrites pour recevoir ces notifications par e-mail et SMS. Cette liste est triviale pour le moment (seulement environ 150), mais elle suffit pour que cela prenne plus d'une minute pour parcourir toute la table des abonnés et envoyer plus de 150 e-mails. (Les e-mails sont envoyés individuellement à la demande des administrateurs système de notre serveur de messagerie en raison des politiques de messagerie de masse.)
Pendant ce temps, l'individu qui a publié l'alerte restera assis sur la dernière page du formulaire pendant près d'une minute sans aucune confirmation positive que sa notification est affichée. Cela conduit à d'autres problèmes potentiels, tout ce qui a des solutions possibles que je trouve loin d'être idéales.
Tout d'abord, l'affiche peut penser que le serveur est à la traîne et cliquer à nouveau sur le bouton «Soumettre», provoquant le redémarrage ou l'exécution du script deux fois. Je pourrais résoudre ce problème en utilisant JavaScript pour désactiver le bouton et remplacer le texte pour dire quelque chose comme «Traitement ...», mais ce n'est pas idéal car l'utilisateur sera toujours bloqué sur la page pendant toute la durée de l'exécution du script. (De plus, si JavaScript est désactivé, ce problème existe toujours.)
Deuxièmement, l'affiche peut fermer l'onglet ou le navigateur prématurément après avoir soumis le formulaire. Le script continuera à s'exécuter sur le serveur jusqu'à ce qu'il essaie de réécrire dans le navigateur, mais si l'utilisateur navigue ensuite sur une page de notre domaine (pendant que le script est toujours en cours d'exécution), le navigateur suspend le chargement de la page jusqu'à ce que le script soit terminé . (Cela ne se produit que lorsqu'un onglet ou une fenêtre du navigateur est fermé et non pas l'ensemble de l'application du navigateur.) Pourtant, c'est loin d'être idéal.
(Possible) Solution
J'ai décidé de séparer la partie "e-mail" du script dans un fichier séparé que je pourrai appeler une fois la notification publiée. J'ai initialement pensé à le mettre sur la page de confirmation une fois la notification publiée avec succès. Cependant, l'utilisateur ne saura pas que ce script est en cours d'exécution et aucune anomalie ne lui sera apparente; Ce script ne peut pas échouer.
Mais que se passe-t-il si je peux exécuter ce script en tant que processus d'arrière-plan? Donc, ma question est la suivante: comment puis-je exécuter un script PHP pour se déclencher en tant que service d'arrière-plan et s'exécuter complètement indépendamment de ce que l'utilisateur a fait au niveau du formulaire?
EDIT: Cela ne peut pas être cron'ed. Il doit s'exécuter au moment où le formulaire est soumis. Ce sont des notifications hautement prioritaires. De plus, les administrateurs système exécutant nos serveurs interdisent aux crons de s'exécuter plus de 5 minutes.
exec()
mais je n'ai jamais essayé cela.
ajax
et j'insère sleep()
avec un intervalle de temps dans la boucle (j'utilise foreach dans mon cas) pour exécuter le processus en arrière-plan. Cela fonctionne parfaitement sur mon serveur. Pas sûr des autres. J'ajoute également ignore_user_abort()
et set_time_limit()
(avec l'heure de fin calculée) avant la boucle pour m'assurer que le script ne sera pas arrêté par le serveur que j'utilise, même selon mon test, le script complétant la tâche sans ignore_user_abort()
et set_time_limit()
.
gearman
avec php pour gérer les tâches en arrière-plan. Il est parfait pour évoluer si vous rencontrez un traitement fastidieux et des charges lourdes. Vous devriez y jeter un œil.