Manejo de HTTP en PHP
Uno de los temas más importantes en todo lenguaje de scripting usado para generación dinámica de sitios web y aplicaciones web es el manejo del protocolo HTTP, conexiones, métodos GET y POST, uploads, headers, cache y demás alternativas. Todas estas funciones están bien soportadas en php de forma tal de tener desde el lneguaje un control completo sobre la forma en que el server interactua con el browser.
Headers: Una de las funciones más importantes de PHP es la función “header” que sirve para enviar al browser un determinado header HTTP, por default en cuanto un script PHP usa una función de salida o transmite algo al browser php envía el header “Content-Type: text/html” al browser. Por eso es importante destacar que la funcion header solo puede usarse ANTES de realizar cualquier tipo de salida al browser.
Ejemplos:
header(“Location: http://lugar/pepe.php”);
Este es un header http que sirve para redireccionar al browser a otra página, script o URL, es muy util para scripts php que procesan datos recibidos desde un formulario o similar y luego en funcion de los datos redireccionan al browser a una página que por ejemplo puede mostrar errores en el ingreso de datos, aceptar los datos o simplemente volver a la página que llamo al script.
Este tipo de redirección sólo puede usarse si no se emitió ninguna salida al browser, si ya se emitió una salida al browser y es necesario redireccionar la página debemos generar desde PHP código JavaScript que transmitimos al browser y el browser si es capaz de interpretar JavaScript podrá redireccionarse a la página pasada, por ejemplo:
< ?
print(“Cosas anteriores”);
if($redireccionar) {
?>
?< }
?>
El browser recibe por ejemplo:
Y automaticamente se redirecciona al URL pasado, el uso de JavaScript desde PHP es importante (ver el capítulo de programacion en el cliente desde el server)
Otro header importante que ya vimos es el de imagen que enviamos antes de pasarle al browser una imagen generada dinámicamente.
Una de las funciones importantes de los headers HTPP es controlar el comportamiento del cache del browser, en numerosas ocasiones tendremos que codificar scripts que generan una cierta salida que no es deseable que sea cacheable, si no impedimos que el browser cachee el resultado del script el usuario tendrá que refrescar manualmente la página desde el browser para ver el nuevo resultado. Los siguientes headers http impiden que el browser cachee una página y sirven tanto para Internet Explorer como para Netscape Navigator:
header(«Cache-Control: no-cache, must-revalidate»);
header(«Pragma: no-cache»);
header(«Expires: Mon,26 Jul 1997 05:00:00 GMT»);
El protocolo HTTP dispone de un mecanismo de autorización básico mediante el cual puede pedirse al browser que promptee al usuario por un usuario y password, luego estos datos se transmiten al web-server y el mismo debe encargarse de autorizar al usuario o no según corresponda. Desde PHP podemos generar los headers correspondientes para que el browser pida al usuario un usuario y password y luego validar estos datos desde el script php (usando una base de datos o lo que corresponda):
< ?php
if(!isset($PHP_AUTH_USER)) {
Header("WWW-Authenticate: Basic realm=\"My Realm\"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel button\n";
exit;} else {
echo "Hello $PHP_AUTH_USER. «; «;
echo «You entered $PHP_AUTH_PW as your password.
}
?>
El header “WWW-Authenticate: Basic realm=\”My Realm\”” fuerza al browser a preguntar al usuario por un user y password, si el usuario cancela el script sigue su ejecución en la próxima línea (notar que enviamos un header de acceso no autorizado y termina el script”). Si el usuario ingresa un usuario y password el browser vuelve a invocar al script pasándole como variables $PHP_AUTH_USER y $PHP_AUTH_PW.
Control de la conexión usando PHP: Internamente PHP mantiene un status de la conexión con el cliente durante la ejecución del script, el valor del status es habitualmente “NORMAL”, pero puede cambiar a “ABORTED” si el usuario presiona el botón de STOP o a “TIEMOUT” si es script sobrepasa el tiempo limite de ejecución que se fija en (/var/lib/php.ini).
Es posible controlar que se hace si el usuario interrumpe la ejecución de un script con el botón de STOP usando dos funciones de PHP:
boolean=connection_aborted()
Devuelve true si la conexión fue abortada por el usuario presionando STOP, cerrando el browser o similar.
register_shutdown_function(nombre_funcion)
Esta función permite registrar el nombre de una función que se ejecutara en los siguientes casos:
a) Cuando el script intenta enviar algo al browser pero el usuario aborto la conexión.
b) Cuando termina normalmente la ejecución del script.
Para distinguir estos dos casos dentro de la función que se registre es importante usar la función connection_aborted para saber si la función se llama por la terminación normal del script o por conexión abortada. La función registrada con register_shutdown_function no puede generar ninguna salida (lo cual dificulta debuggearla), usualmente sirve para chequear consistencia en bases de datos, eliminar archivos temporales que pueden quedar abiertos, loggear un problema, registrar que la conexión fue abortada, hacer rollback de una transacción o similares.
Fuente: Documento Generación de web sites dinámicos usando PHP