¿Se detiene la ejecución de php después de que un usuario abandona la página?


Quiero ejecutar un script relativamente lento basado en alguna entrada de formulario, pero prefiero no recurrir a cron, así que me pregunto si una página php solicitada a través de ajax continuará ejecutándose hasta su finalización o si se detendrá si el usuario abandona la página.

En realidad no sale al navegador hasta un json_encode al final del archivo, por lo que todo lo anterior todavía se ejecutaría?

Author: Stephen Belanger, 2009-08-15

5 answers

Depende.

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

Cuando un script PHP se está ejecutando normalmente el estado NORMAL, está activo. Si el cliente remoto desconecta el ABORTADO la bandera del estado está encendida. Remoto la desconexión del cliente suele ser causada por el usuario pulsando su botón de PARADA.

Puedes decidir si quieres o no un cliente se desconecta para causar su script para ser abortado. A veces es útil para que siempre se ejecuten sus scripts hasta la finalización, incluso si no hay navegador remoto que recibe la salida. Sin embargo, el comportamiento predeterminado es para su script para ser abortado cuando el el cliente remoto se desconecta. Este el comportamiento se puede configurar a través de ignore_user_abort php.directiva ini como así como a través de la correspondiente php_value ignore_user_abort Apache httpd.directiva conf o con el ignore_user_abort() función.

Eso parecería decir que la respuesta a su pregunta es " Sí, el script terminará si el usuario deja la página".

Sin embargo darse cuenta de que dependiendo de la SAPI backend que se utiliza (por ejemplo, mod_php), php no puede detectar que el cliente ha abortado la conexión hasta que se intente enviar información al cliente . Si su script de larga duración no emite un flush(), el script puede seguir ejecutándose aunque el usuario haya cerrado la conexión.

Complicar las cosas es incluso si hacer emitir llamadas periódicas a flush(), teniendo búfer de salida en causará que esas llamadas se atrapen y no las enviará al cliente hasta que el script se complete de todos modos!

Lo que complica las cosas es que si ha instalado manejadores de Apache que almacenen la respuesta en búfer (por ejemplo mod_gzip), una vez más php no detectará que la conexión está cerrada y el script seguirá transportando.

Uf.

 69
Author: Crescent Fresh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-15 00:26:00

Depende de su configuración-por lo general se detendrá, pero se puede utilizar ignore_user_abort() para que continúe.

 6
Author: Greg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-14 21:28:48

Dependiendo de la configuración del servidor web y/o PHP, el proceso PHP puede, o no, matar el hilo cuando el usuario termina la conexión HTTP. Si una solicitud AJAX está pendiente cuando el usuario se aleja de la página, depende de que el navegador elimine la solicitud (no garantizada) ontop de la configuración de su servidor (no garantizada). No es la respuesta que quieres escuchar!

Recomendaría crear una cola de trabajo en un archivo plano o base de datos que se ejecute constantemente El demonio PHP puede buscar trabajos. No sufre de cron retraso, pero mantiene el uso de CPU/memoria a un nivel utilizable. Una vez completado el trabajo, coloque los resultados en el archivo plano/base de datos para AJAX fetch. O prometer enviar un correo electrónico al usuario una vez que el trabajo haya terminado (mi método preferido).

Esperanza que ayuda

 1
Author: Al.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-14 21:35:25

Si el cliente/usuario/descargador/visor aborta o se desconecta, el script seguirá ejecutándose hasta que algo intente eliminar nuevos datos del cliente. A menos que haya usado ignore_user_abort(), el script morirá allí. En el mismo orden, PHP no puede determinar si el cliente todavía está allí sin intentar vaciar ningún dato al httpd.

 0
Author: Havenard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-15 03:32:16

Encontré la solución real para mi caso de que no terminara la conexión. La SESIÓN en mi servidor Apache/Php necesitaba cerrarse antes de que pudiera comenzar la siguiente.

El navegador espera que la llamada ajax se complete después de abortar.

 0
Author: Artistan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:52:53