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.