usar para listos instrucciones etiquetas comandos codigos cerrar abrir php ajax cron execution

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



instrucciones php (5)

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

En realidad, no se envía al navegador hasta que haya un json_encode al final del archivo, ¿así que todo antes de eso todavía se ejecutaría?


Depende de su configuración, normalmente se detendrá, pero puede usar ignore_user_abort() para que continúe.


Depende.

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

Cuando un script PHP se ejecuta normalmente, el estado NORMAL está activo. Si el cliente remoto se desconecta, se enciende el indicador de estado ABORTADO. La desconexión de un cliente remoto suele deberse a que el usuario presiona el botón STOP.

Puede decidir si desea o no que una desconexión del cliente haga que su script sea abortado. A veces es útil tener siempre los scripts ejecutados hasta el final, incluso si no hay un navegador remoto que reciba la salida. Sin embargo, el comportamiento predeterminado es que la secuencia de comandos se anule cuando el cliente remoto se desconecta. Este comportamiento se puede establecer a través de la directiva ignore_user_abort php.ini, así como a través de la php_value ignore_user_abort correspondiente de Apache o con la función ignore_user_abort() .

Eso parece decir que la respuesta a su pregunta es "Sí, la secuencia de comandos terminará si el usuario abandona la página".

Sin embargo, mod_php cuenta que, dependiendo del backend SAPI que se esté utilizando (por ejemplo, mod_php ), php no puede detectar que el cliente haya abortado la conexión hasta que se intente enviar información al cliente . Si su secuencia de comandos de ejecución prolongada no emite un flush() la secuencia de comandos puede continuar ejecutándose aunque el usuario haya cerrado la conexión.

Para complicar las cosas, incluso si realiza llamadas periódicas a flush() , tener el búfer de salida activado hará que esas llamadas queden atrapadas y no las enviará al cliente hasta que la secuencia de comandos se complete de todos modos.

Para complicar aún más las cosas, si ha instalado controladores de Apache que almacenan en búfer la respuesta (por ejemplo, mod_gzip ), una vez más, php no detectará que la conexión está cerrada y que el script continuará en el camión.

Uf.


Dependiendo de la configuración del servidor web y / o PHP, el proceso de PHP puede, o no, matar el hilo cuando el usuario termina la conexión HTTP. Si una solicitud AJAX está pendiente cuando el usuario abandona la página, depende de que el navegador elimine la solicitud (no garantizada) en la parte superior 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 un demonio PHP en ejecución constante pueda sondear para buscar trabajos. No sufre de retraso cron , pero mantiene el uso de CPU / memoria a un nivel utilizable. Una vez que se complete el trabajo, coloque los resultados en el archivo plano / base de datos para la recuperación de AJAX. O prometa enviar un correo electrónico al usuario una vez que finalice el trabajo (mi método preferido).

Espero que ayude



Si el cliente / usuario / descargador / visor se interrumpe o se desconecta, la secuencia de comandos continuará ejecutándose hasta que algo intente vaciar los datos nuevos en el 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 en httpd.