strip_tags remove quitar para funcion etiquetas ent_quotes ejemplo php ajax

remove - PHP mata automáticamente una secuencia de comandos si la solicitud HTTP se cancela/cierra



strip_tags wordpress (4)

Echa un vistazo a la función PHP connection_aborted (). Mientras realiza su procesamiento, a veces puede verificar que la conexión abortada cancele el progreso, como se haría en un modelo de subprocesamiento interactivo.

El problema es que, durante un largo proceso, el script PHP sigue ejecutando si el navegador del cliente está actualmente conectado o no. ¿Hay alguna posibilidad de que si el cliente ha terminado la llamada de Ajax a un script, entonces el script también finalice en el servidor?



Una forma en la que he encontrado que es la forma más fácil de manejar este problema de tiempo de espera es como tal:

1: establecer un valor en el servidor como ''procesamiento''. Comience un hilo independiente para hacer el procesamiento.
2: la llamada inicial ajax devuelve un éxito
3: el javascript en la página entra en el "modo de espera" que envía una nueva solicitud ajax cada 10 o 30 o 60 segundos o cinco o diez minutos o lo que sea (según su situación) para averiguar si el valor en el servidor sigue siendo establecer en ''procesamiento''.
4: el hilo independiente se completa. Establece el valor en el servidor a ''hecho''.
5: El javascript en la página realiza su siguiente consulta en modo de espera, y devuelve ''hecho'' y los datos apropiados.

4b: si transcurre una cantidad obscena de tiempo sin un ''hecho'', se registra como una falla. Cuánto tiempo es obsceno depende de su situación. Envíe una llamada ajax actualizando el valor de ''procesamiento'' a ''cancelar''. 5b: el hilo independiente verifica periódicamente el estado para asegurarse de que aún está configurado como ''procesamiento''. Si ve un cambio de modo en ''cancelar'', se cancela a sí mismo.


Como señala @metadings, php tiene una función para verificar el aborto de conexión llamado connection_aborted (). Devolverá 1 si la conexión finaliza de lo contrario 0.

En un proceso largo del lado del servidor, el usuario puede necesitar saber si el cliente está desconectado del servidor o si ha cerrado el navegador, entonces el servidor puede cerrar el proceso de forma segura.

Especialmente en un caso en el que la aplicación usa sesiones php, si dejamos el proceso largo ejecutándose incluso después de desconectar al cliente, el servidor no responderá a esta sesión. Y cualquier otra solicitud del mismo cliente esperará hasta que el proceso anterior se ejecute por completo. El motivo de esta situación es que el archivo de sesión está bloqueado cuando el proceso se está ejecutando. Sin embargo, puede llamar intencionalmente al método session_write_close () para desbloquearlo. Pero esto no es factible en todos los escenarios, puede ser necesario escribir algo para la sesión al final del proceso.

Ahora bien, si solo llamamos a connection_aborted () en un bucle, siempre devolverá 0 si la conexión está cerrada o no.

0 significa que la conexión no se cancela. Es engañoso. Sin embargo, después de la re-búsqueda y experimentos, si han descubierto que el buffer de salida en php es la razón.

En primer lugar, para comprobar si se produce un aborto, el desarrollador en un bucle debe enviar alguna salida al cliente haciendo eco de algún texto. Por ejemplo:

print " ";

Como el proceso aún se está ejecutando, la salida no se enviará al cliente. Ahora para enviar la salida, necesitamos lavar el buffer de salida.

flush (); ob_flush ();

Y luego, si buscamos abortos, entonces dará resultados correctos.

if (connection_aborted () != 0) { die(); }

A continuación se muestra el ejemplo de trabajo, esto funcionará incluso si está utilizando la sesión de PHP:

session_start (); ignore_user_abort ( TRUE ); file_put_contents ( "con-status.txt", "Process started../n/n" ); for($i = 1; $i <= 15; $i ++) { print " "; file_put_contents ( "con-status.txt", "Running process unit $i /n", FILE_APPEND ); sleep ( 1 ); // Send output to client flush (); ob_flush (); // Check for connection abort if (connection_aborted () != 0) { file_put_contents ( "con-status.txt", "/nUser terminated the process", FILE_APPEND ); die (); } } file_put_contents ( "con-status.txt", "/nAll units completed.", FILE_APPEND );

EDICIÓN 07-ABR-2017

Si alguien está usando Fast-Cgi en Windows, entonces puede finalizar el hilo CGI de la memoria cuando se interrumpe la conexión usando el siguiente código:

if (connection_aborted () != 0) { apache_child_terminate(); exit; }