Internamente en PHP se mantiene un estatus de la conexión. Hay 3 posibles estados:
Cuando un script en PHP esta ejecutándose, normalmente esta activo el estado NORMAL. Si el cliente remoto se desconecta, el flag ABORTED es activado. Un cliente remoto se desconecta usualmente porque el usuario presiona su botón STOP. Si el tiempo limite PHP-imposed (ver set_time_limit()) es activado, el flag TIMEOUT se activa.
Se puede decidir si se desea que un cliente se desconecte o no a causa
de que se aborte el script. Algunas veces es útil que los scripts se
ejecuten inclusive si ya no hay un navegador recibiendo la salida.
El comportamiento por defecto es que el script sea abortado cuando el
cliente remoto se desconecte. Este comportamiento puede ser establecido
a través de la directiva ignore_user_abort en php.ini así como a través
de la directiva correspondiente de Apache en httpd.conf
php_value ignore_user_abort o
con la función ignore_user_abort(). Si se decide
no decirle a PHP que ignore abortar al usuario y el usuario aborta,
el script terminará. La única excepción es si se tiene registrada una
función de cierre usando register_shutdown_function().
Con una función de cierre, cuando el usuario remoto activa el botón STOP,
la próxima vez que el script intente mostrar algo, PHP detectará que la
conexión fue abortada y la función de cierre es llamada.
Esta función de cierre también es llamada al final del script cuando
termina normalmente, así que para hacer algo diferente en el caso de que
un cliente se desconecte usar la función connection_aborted().
Esta función retornará TRUE
si la conexión fue abortada.
El script puede ser terminado también por el temporizador incorporado en los scripts. El tiempo por defecto es de 30 segundos. Puede ser cambiado usando la directiva max_execution_time de php.ini o la correspondiente directiva php_value max_execution_time de Apache httpd.conf así como con la función set_time_limit(). Cuando el temporizador expira el script será abortado y así como el caso del cliente anterior que se desconecto, si la función de cierre ha sido registrada ésta será llamada. Dentro de esta función de cierre se puede comprobar para ver si el timeout causa la función de cierre llamando a la función connection_status(). Esta función retornará 2 si el timeout causo la llamada a la función de cierre.
Una cosa a notar es que ambos estados ABORTED y TIMEOUT pueden ser activados al mismo tiempo. Esto es posible si se le dice a PHP que ignore el aborto del usuario. PHP notará de hecho que un usuario podría haber roto la conexión, pero el script se mantendrá ejecutándose. Si este activa el limite de tiempo será abortado y la función de cierre, si existe, será llamada. A este punto, se encontrará que connection_status() retorna 3.