2012-01-18 15 views
18

Llamo a un script php sobre ajax para hacer un mantenimiento de la base de datos. Si el usuario cierra la página, responde o hace clic en un enlace, ¿se ejecutará por completo el script php? ¿Hay una manera de hacerlo?¿Qué sucede si un usuario sale del navegador o cambia de página antes de que la solicitud AJAX haya finalizado?

Tal vez si el script php llamado método exec() o algo similar, que a su vez llamar a un script a través de la consola hasta que aparezca:

$ php /var/www/httpdocs/maintenance.php 

?

Respuesta

13

Siempre que el agente de usuario (navegador, etc.) haya enviado la solicitud por completo, el servidor tiene todo lo que necesita y completará la solicitud e intentará enviar una respuesta.

De hecho, este tipo de comportamiento de "ping" se utiliza a menudo para procesos "heartbeat" que mantienen un servicio cálido o realizan un mantenimiento periódico.

2

Una vez que la solicitud web llega a su servidor, realmente no importa si el usuario cierra su navegador o navega fuera. Su servidor aún responderá, pero nadie escuchará la respuesta.

+0

¿hay alguna manera de evitar eso? –

+0

@SushantBajracharya Puede usar una variable que está configurada en "1" cuando se realiza la llamada, y si el usuario intenta redirigir mientras la variable es "1", recibe un mensaje que le dice que no puede. Cuando se realiza la llamada, vuelve a "0" y permite la redirección. –

14

Es una condición de carrera. PHP detectará en algún momento (generalmente al intentar hacer la salida) que Apache está gritando en su cara que el usuario remoto ha cerrado la conexión. Si todo lo que quería hacer en ese punto depende de cómo esté estructurado su código.

Si quiere asegurarse de que todas las operaciones se completen antes de que el script se cierre, use ignore_user_abort(TRUE), que mantiene PHP funcionando después de que se corta la conexión. Todavía está sujeto a los límites de max_execution_time del usuario y lo que sea, pero no se cerrará porque se desconectó.

+0

Entonces, ¿un script PHP podría detenerse antes de que su ejecución haya finalizado si Apache detecta que la conexión remota se ha cerrado? –

+1

Hahaha, encontré esa función justo después de publicar, intenté cancelar mi pregunta y responderla yo mismo, pero aún no tengo una reputación lo suficientemente alta.Esto es lo que quería escribir, disculpe por hacer que todos pierdan el tiempo buscando incorrectamente: ** Ok, todavía no sé qué pasa exactamente con AJAX, pero encontré una forma de evitar que los scripts PHP finalicen si el usuario interrumpe el script php con la función: ignore_user_abort() http://php.net/manual/en/function.ignore-user-abort.php que debería haber hecho mi investigación sobre PHP desde el principio en lugar de AJAX, lo encontré de inmediato. ** – NaturalBornCamper

+0

Podría, pero no tiene que hacerlo. hay otros factores en juego, pero en teoría sí, un usuario podría (por ejemplo) manejar totalmente un proceso de pago de comercio electrónico presionando ESC después de actualizar el inventario de la tienda pero antes de que se haya procesado el pago. –

0

Una vez que se inicia la llamada ajax, el usuario puede hacer lo que quiera. Si cierran la página, simplemente no recibirán los comentarios (si los hay) de la llamada ajax que se realizó.

0

Si el php comienza a ejecutarse, continuará ejecutándose, independientemente de si el usuario cierra la ventana o navega fuera de la página.

0

La secuencia de comandos php se completará, independientemente del estado del navegador. El php se analiza en el servidor, y eso no le importa si el cliente aún está abierto o no.

0

Si se completó la solicitud HTTP, entonces sí, la secuencia de comandos PHP se ejecutará completamente incluso si la computadora del cliente está cerrada.

1

Varía en la configuración, el servidor web, el sistema operativo, etc.

Por lo general, la solicitud se procesará como de costumbre, y la respuesta nunca se leerá. Ocasionalmente, una escritura puede fallar antes y la solicitud falla durante el procesamiento.

Cuestiones relacionadas