Manejando conexiones

Cap铆tulo 40. Manejando conexiones

Nota: Todo lo siguiente se aplica a partir de la versi贸n 3.0.7 y posterior.

Internamente en PHP se mantiene el estado de la conexi贸n. Hay 3 posibles estados:

Cuando un script PHP se est谩 ejecutando se activa el estado NORMAL. Si el cliente remoto se desconecta, se pasa al estado ABORTED. Esto suele ocurrir cuando el usuario pulsa en el bot贸n STOP del navegador. Si se alcanza el l铆mite de tiempo impuesto por PHP (ver set_time_limit()), se pasa al estado TIMEOUT.

Puedes decidir si quieres que la desconexi贸n de un cliente cause que tu script sea abortado. Algunas veces es c贸modo que tus scripts se ejecuten por completo, incluso si no existe ya un navegador remoto que reciba la salida. El comportamiento por defecto es sin embargo, que tu script se aborte cuando el cliente remoto se desconecta. Este comportamiento puede ser configurado v铆a la directiva ignore_user_abort en el fichero php3.ini, o tambi茅n con la funci贸n ignore_user_abort(). Si no le espeficicas al PHP que cuando un usuario aborte lo ignore, tu script terminar谩 su ejecuci贸n. La 煤nica excepci贸n es si tienes registrada un funci贸n de desconexi贸n usando la funci贸n register_shutdown_function(). Con una funci贸n de desconexi贸n, cuando un usuario remoto pulsa en el bot贸n STOP, la pr贸xima vez que tu script intenta mostrar algo, PHP detecta que la conexi贸n ha sido abortada y se llama a la funci贸n de desconexi贸n. Esta funci贸n de desconexi贸n tambi茅n se llama al final de la ejecuci贸n de tu script cuando se ha ejecutado normalmente, de manera que si quieres hacer algo diferente en caso de que un cliente se haya desconectado, puedes usar la funci贸n connection_aborted(). Esta funci贸n devuelve TRUE si la conexi贸n fue abortada.

Vuestro script tambi茅n se puede terminar por un temporizador interno. El timeout por defecto es de 30 segundos. Se puede cambiar usando la directiva max_execution_time en el fichero php.ini o la correspondiente directiva php_max_execution_time en la configuraci贸n del servidor de p谩ginas Apache, como tambi茅n con la funci贸n set_time_limit(). Cuando el temporizador expira, el script se aborta como en el caso de la desconexi贸n del cliente, de manera que si se ha definido una funci贸n de desconexi贸n, esta se llamar谩. Dentro de esta funci贸n de desconexi贸n, puedes comprobar si fue el timeout el que caus贸 que se llamara a la funci贸n de desconexi贸n, llamando a la funci贸n connection_timeout(). Esta funci贸n devolver谩 verdadero si el timeout causa que se llame a la funci贸n de desconexi贸n.

Hay que destacar que ambos, el estado ABORTED y el TIMEOUT, se pueden activar al mismo tiempo. Esto es posible si le dices a PHP que ignore las desconexiones intencionadas de los usuarios. PHP a煤n notar谩 el hecho de que el usuario puede haberse desconectado, pero el script continuar谩 ejecut谩ndose. Si se alcanza el tiempo l铆mite de ejecuci贸n ser谩 abortado y, si se ha definido una funci贸n de desconexi贸n, esta ser谩 llamada. En este punto, encontrar谩s que las funciones connection_timeout() y connection_aborted() devuelven verdadero. Puedes comprobar ambos estados de una manera simple usando la funci贸n connection_status(). Esta funci贸n devuelve un campo de bit de los estados activos. De este modo, si ambos estados est谩n activos devolver铆a por ejemplo un valor 3.