Gestión de las conexiones

El estado de las conexiones se conserva internamente por PHP. Hay cuatro estados posibles:

  • 0 - NORMAL (normal)
  • 1 - ABORTED (anulado)
  • 2 - TIMEOUT (caducado)
  • 3 - ABORTED and TIMEOUT (anulado y caducado)

Cuando un script PHP está en ejecución, el estado es NORMAL. Si el cliente remoto se desconecta, el estado se convierte en ABORTED. Una desconexión del cliente remoto generalmente es causada por los usuarios presionando su botón STOP. Si se supera el tiempo máximo de ejecución de PHP, (ver set_time_limit()), el script adopta el estado TIMEOUT.

Asimismo, se puede decidir si se desea que la desconexión de un cliente provoque la interrupción del script. A veces es práctico que los scripts continúen ejecutándose hasta el final, incluso si el cliente ya no está presente para recibir la información. Sin embargo, por omisión, el script se detendrá tan pronto como el cliente se desconecte. Este comportamiento puede ser modificado con la directiva ignore_user_abort en el fichero php.ini o bien con la directiva Apache php_value ignore_user_abort del fichero Apache httpd.conf o con la función ignore_user_abort(). Si no se solicita a PHP que ignore la desconexión, y el usuario se desconecta, el script será terminado. La única excepción es si se ha registrado una función de cierre, con register_shutdown_function(). Con tal función, cuando el usuario interrumpe su solicitud, en la próxima ejecución del script, PHP se dará cuenta de que el último script no ha sido terminado, y desencadenará la función de cierre. Esta función también será llamada al final del script, si este termina normalmente. Para poder tener un comportamiento diferente según el estado del script al finalizar, se pueden ejecutar comandos específicos a la desconexión gracias a la función connection_aborted(). Esta función devolverá true si la conexión ha sido anulada.

El script también puede ser interrumpido automáticamente después de un cierto tiempo. Por omisión, el tiempo límite es de 30 segundos. Este valor puede ser cambiado utilizando la directiva PHP max_execution_time en el fichero php.ini o con la directiva php_value max_execution_time, en el fichero Apache httpd.conf o también con la función set_time_limit(). Cuando el tiempo límite expira, el script es terminado, y como en la desconexión del cliente, una función de terminación será llamada. En esta función, se puede saber si es el tiempo límite el que ha causado el fin del script, llamando a la función connection_status(). Esta función devolverá 2 si el tiempo límite ha sido superado.

Una cosa a tener en cuenta es que los dos casos ABORTED y TIMEOUT pueden ser llamados al mismo tiempo. Esto es posible si se solicita a PHP que ignore las desconexiones de los usuarios. PHP aún así notará el hecho de que el usuario se ha desconectado, pero el script continuará. Luego, cuando alcance el límite de tiempo, el script caducará. En ese momento, la función connection_status() devolverá 3.