2010-03-07 16 views
5

Tengo un sitio web que funciona con PHP en el lado del servidor.PHP: ignore_user_abort (true) en todos los scripts

páginas de acceso a usuarios y PHP hace algunos cálculos, escribe datos en una base de datos MySQL, etc.

Imagine un usuario accede a una página en PHP crea una cuenta para el usuario. La creación consta de dos partes: insertar los datos de registro en la tabla "usuarios" e insertar ajustes para esta cuenta en la tabla "configuración". Estas son dos consultas SQL que deben ejecutarse una tras otra. Si el usuario sale de la página después de la primera consulta, no hay ningún valor insertado en "configuración".

¿Cómo puedo evitar este problema? Creo simplemente usando ignore_user_abort (true), ¿verdad?

¿No es útil invocar ignore_user_abort (true) en la parte superior de cada script PHP? No conozco ningún caso en el que deba causar problemas.

Respuesta

8

Para su ejemplo específico, el uso de transacciones de bases de datos (como lo menciona Ignacio) sería el enfoque más adecuado.

Hay otros casos en los que es posible que desee asegurarse de que el usuario no puede abortar antes, sin embargo, no relacionados con las bases de datos. Por ejemplo, si actualiza la base de datos y luego envía un correo, no desea que un usuario pueda detener el proceso antes de que el correo se apague. En este tipo de caso, sería apropiado ignore_user_abort.

Sin embargo, tenga en cuenta que una tubería rota debido a que el cliente cancela la conexión no detiene la ejecución inmediatamente, solo en el punto en el que intenta escribir en la salida del script. Esto puede hacerse llamando a echo o print, o incluso simplemente cerrando la etiqueta de PHP e insertando algunos espacios en blanco antes de abrir uno nuevo (... ?> <?php ...). Entonces, si tiene toda la parte de 'acción' de su script en la parte superior de la página, antes de intentar escribir cualquier contenido de página, no tiene que preocuparse por las interrupciones de las tuberías rotas que afectan la lógica de su aplicación.

Y, por supuesto, debe separar de todos modos la lógica de acción del contenido de la página.

2

Si necesita que las consultas múltiples sucedan por completo o no se realicen en absoluto, entonces debe hacerlo correctamente utilizando transacciones en lugar de ponerle un vendaje al problema.

Puede ser útil para que el lado remoto anule una solicitud si, p. la solicitud implica largos cálculos y el usuario decide que no necesita los resultados después de todo.

1

Puede establecer ignore_user_abort en php.ini: PHP.ini configuration

yo no haría esto, sin embargo. Preferiría que la página de PHP inicie otra instancia de PHP en la línea de comandos que hace las consultas en segundo plano, p. usando exec.

Además, es posible que su concepto de flujo básico esté sesgado. Si el usuario aborta la ejecución de un cálculo, probablemente deba volver a tirarlo correctamente de todos modos, pero eso depende de la naturaleza de lo que se está haciendo.

Cuestiones relacionadas