Manejo de conexiones
Internamente, en PHP se mantiene un estado de conexión. Hay 4
posibles estados:
- 0 - NORMAL
- 1 - ABORTED
- 2 - TIMEOUT
- 3 - ABORTED y TIMEOUT
Cuando un script de PHP está ejecutándose normalmente está activo el estado NORMAL (normal).
Si el cliente remoto se desconecta, se activa el indicador de estado
ABORTED (abortada). Un cliente remoto se desconecta normalmente porque
presiona su botón STOP. Si se alcanza el tiempo límite impuesto por PHP
(véase set_time_limit()), se activa el indicador de estado
TIMEOUT (expirada).
Se puede decidir si se desea que un cliente que se desconecte ocasione
que se aborte el script. Algunas veces es útil que los scripts se ejecuten
hasta su finalización, incluso si ya no hay un navegador remoto recibiendo
la salida. Sin embargo, el comportamiento predeterminado 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 de php.ini, así como a través
de la directiva correspondiente de Apache
php_value ignore_user_abort
de httpd.conf, o
con la función ignore_user_abort(). Si se decide no
indicarle a PHP que ignore que el usuario aborte y el usuario aborta, el script
finalizará. La única excepción es si se tiene registrada una función de apagado
con register_shutdown_function(). Con una
función de apagado, 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, llamando así a la función de apagado.
Esta función de apagado también se invoca al final del script cuando
finaliza normalmente, así que para hacer algo diferente en caso de que un
cliente se desconecte, se puede emplear la función connection_aborted().
Esta función devolverá true
si la conexión fue
abortada.
El script puede ser finalizado también por el temporizador de script
incorporado. El tiempo predeterminado es de 30 segundos. Se puede cambiar
con la directiva max_execution_time de php.ini o la
correspondiente de Apache php_value max_execution_time
de httpd.conf, así como con la
función set_time_limit(). Cuando el temporizador
expira, el script se abortará y, como el caso del cliente anterior que
se desconectó, si la función de apagado ha sido registrada, será llamada.
Dentro de esta función de apagado se puede comprobar si el tiempo de
espera causó la llamada a la función de apagado invocando a
la función connection_status(). Esta función devolverá
2 si el tiempo de espera causó la llamada a la función de apagado.
Una cosa a observar es que los estados ABORTED y TIMEOUT pueden estar
activados al mismo tiempo. Esto es posible si se le indica a PHP
que ignore los abortos que ocasione el usuario. PHP notará de hecho que un
usuario podría haber roto la conexión, pero el script se mantendrá
ejecutándose. Si entonces se alcanza el límite de tiempo, será abortado y
la función de apagado, si la hubiera, será llamada. En este punto se
encontrará que connection_status()
devuelve 3.