39 votes

L'exécution de php s'arrête-t-elle lorsque l'utilisateur quitte la page ?

Je veux exécuter un script relativement long basé sur une certaine entrée de formulaire, mais je préfère ne pas recourir à cron, donc je me demande si une page php demandée par ajax continuera à s'exécuter jusqu'à la fin ou si elle s'arrêtera si l'utilisateur quitte la page.

Il ne s'affiche pas dans le navigateur avant un json_encode à la fin du fichier, donc tout ce qui précède s'exécute quand même ?

73voto

Crescent Fresh Points 54070

Ça dépend.

De http://us3.php.net/manual/en/features.connection-handling.php :

Quand un script PHP s'exécute normalement l'état NORMAL, est actif. Si le client distant se déconnecte, l'état ABORTED est activé. Une déconnexion client distant est généralement causée par l'utilisateur appuie sur son bouton STOP.

Vous pouvez décider si vous voulez ou non qu'une déconnexion du client entraîne votre script soit interrompu. Parfois, il est pratique de toujours faire en sorte que vos script s'exécutent jusqu'à la fin, même s'il n'y a pas navigateur distant ne reçoit la sortie. Le comportement par défaut est cependant pour votre script soit interrompu lorsque le client client distant se déconnecte. Ce comportement peut être défini via l'option ignore_user_abort directive php.ini comme ainsi qu'à travers la directive php_value ignore_user_abort Apache httpd.conf ou avec la directive ignore_user_abort() fonction.

Cela semble dire que la réponse à votre question est "Oui, le script se terminera si l'utilisateur quitte la page".

Cependant, il faut savoir que, selon le backend SAPI utilisé (par ex, mod_php ), php ne peut pas détecter que le client a interrompu la connexion jusqu'à ce qu'une tentative soit faite pour envoyer des informations au client. . Si votre script à long terme n'émet pas un flush() le script peut continuer à s'exécuter même si l'utilisateur a fermé la connexion.

Pour compliquer les choses, même si vous faire émettre des appels périodiques à flush() ayant mise en mémoire tampon des sorties on fera en sorte que ces appels soient piégés et ne les enverront pas au client avant que le script ne se termine de toute façon !

Plus d'informations sur Ce qui complique les choses, c'est que vous avez installé des gestionnaires Apache qui mettent la réponse en mémoire tampon (par exemple mod_gzip ), une fois encore, php ne détectera pas que la connexion est fermée et le script continuera à fonctionner.

Ouf.

6voto

Greg Points 132247

Cela dépend de vos paramètres - en général, il s'arrête mais vous pouvez utiliser ignore_user_abort() pour que ça continue.

1voto

Al. Points 2254

Selon la configuration du serveur web et/ou de PHP, le processus PHP peut, ou non, tuer le thread lorsque l'utilisateur met fin à la connexion HTTP. Si une demande AJAX est en attente lorsque l'utilisateur quitte la page, il faut que le navigateur tue la demande (ce qui n'est pas garanti). sur le site de la configuration de votre serveur (non garanti). Ce n'est pas la réponse que vous voulez entendre !

Je recommanderais de créer une file d'attente de travail dans un fichier plat ou une base de données qu'une Démon PHP peuvent voter pour des emplois. Il ne souffre pas de cron mais maintient l'utilisation du processeur et de la mémoire à un niveau utilisable. Une fois le travail terminé, placez les résultats dans le fichier plat/la base de données pour une extraction AJAX. Ou promettez d'envoyer un e-mail à l'utilisateur une fois le travail terminé (ma méthode préférée).

J'espère que cela vous aidera.

0voto

Havenard Points 9023

Si le client/utilisateur/téléchargeur/visualisateur abandonne ou se déconnecte, le script va continuer à courir jusqu'à ce que quelque chose essaie d'envoyer de nouvelles données au client. A moins que vous n'ayez utilisé ignore_user_abort() le script y mourra. Dans le même ordre d'idée, PHP est incapable de déterminer si le client est toujours là sans essayer d'envoyer des données à l'httpd.

0voto

Artistan Points 105

J'ai trouvé la solution pour mon cas de non terminaison de la connexion. La SESSION de mon serveur Apache/Php devait être fermée avant que la suivante puisse démarrer.

Le navigateur attend que l'appel ajax se termine après l'abandon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X