You are on page 1of 12

Sesiones en PHP

1. ¿QUÉ ES UNA SESIÓN? emos visto que podemos utilizar las cookies para almacenar información del usuario. La idea es proporcionar un método para que el servidor pueda diferenciar entre las distintas peticiones que realizan los usuarios. La pregunta que se plantea es: ¿cómo consigue el servidor diferenciar entre cada una de estas peticiones HTTP? Es decir, ¿cómo se identifica el navegador a la hora de realizar sus peticiones al servidor? Para conseguirlo, el servidor trabaja con el concepto de sesión, facilitando al programador un recipiente o lugar donde almacenar información que esté disponible en toda la visita del usuario al sitio web. Veremos que esta información de sesión está disponible a través del array superglobal $_SESSION y almacenada físicamente de alguna forma en el servidor. Cada sesión establecida tiene su correspondiente array $_SESSION, donde podremos almacenar información que queremos que esté disponible en todas las páginas de la aplicación, pero sólo para la sesión particular que la ha originado. Para que entienda lo que es una sesión del navegador, veamos cuándo se inicia y cuándo finaliza. Una sesión empieza cuando el navegador solicita una página con la extensión .php que se encuentra almacenada en un directorio del servidor web. No importa dónde esté dicha página: así podría estar incluida en una subcarpeta del directorio raíz de la aplicación. Lo importante es que está en el ámbito de una aplicación PHP. Una sesión finaliza cuando el navegador abandona la sesión, ya sea ejecutando código que expresamente la finaliza o porque haya transcurrido el tiempo máximo de duración que hemos establecido para las sesiones y no se ha vuelto a realizar ninguna petición adicional. Observe cómo el hecho de cerrar el navegador no implica que estemos abandonando la sesión, ya que el servidor no puede darse cuenta de esta circunstancia. La sesión finalizará sólo en los casos anteriormente mencionados.

H

Copyright (c) Computer Aided Education S.A.

1

Sesiones en PHP

Y aquí está la clave del asunto: el servidor crea una cookie que identifica la petición que está atendiendo, es decir, la sesión del navegador. El servidor envía dicha cookie al correspondiente navegador y crea un array $_SESSION correspondiente. Cuando el navegador vuelva a realizar una petición, le enviará esta cookie, por lo que el servidor puede reconocer que se trata de la sesión iniciada anteriormente y permitir que se trabaje con la información particular. Por lo tanto, para mantener la información sobre las sesiones se utilizan cookies, lo que quiere decir que el navegador debe permitirlo. ¿Qué ocurre si el navegador no lo permite? Dependiendo de la configuración de PHP, el servidor buscará otra forma de transmitir el identificador de la sesión, ya sea mediante un parámetro GET (en la URL de la página) o POST (por ejemplo, como un campo oculto de un formulario). Por otra parte, la cookie que identifica la sesión se crea automáticamente, por lo que no necesitaremos utilizar la función setcookie. Además, por defecto se mantiene en la memoria del navegador, por lo que, si se cierra y se vuelve a abrir el navegador, el servidor no podrá reconocer la sesión y creará una nueva. De ahí que sea conveniente cerrar las sesiones explícitamente. Por ejemplo, podríamos incorporar un botón “Desconectar” o “Cerrar la sesión” para que el usuario pueda hacerlo. Sin embargo, la información almacenada en el servidor correspondiente a la sesión anterior seguiría existiendo hasta que transcurra el tiempo necesario para que sea eliminada.

PHP permite otro medio para poder utilizar el estado de sesión sin necesidad de mantener cookies, como ya veremos.

2

Sesiones en PHP

2. EL ARRAY $_SESSION omo ya sabemos, el servidor crea un array $_SESSION por cada una de las sesiones que se establecen y lo mantiene hasta que finaliza la sesión. En este array podemos almacenar la información que queramos mantener durante toda la sesión. Lo bueno, es que sólo se referirá a dicha sesión, identificando, de esta forma, al navegador del usuario. Las sesiones son, por lo tanto, otra forma de almacenar información de un determinado usuario, pero, a diferencia de las cookies, esa información se almacena en el servidor, por lo que se tiene control total sobre dicha información.

C

Fíjese en la figura anterior en la que tenemos una página web donde aparece una lista desplegable con una serie de productos y un botón que permite enviar al servidor cuál es el producto elegido. Veamos cómo manejar las sesiones con este ejemplo. Archivo sesiones.php:
<html> <head> <title>Sesiones</title><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> <?php if (!$_POST) { ?> <p>Elija el producto y pulse en Enviar:</p>

Copyright (c) Computer Aided Education S.A.

3

Sesiones en PHP

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <select size="1" name="Productos"> <option>Placa MMX-100</option> <option>Placa MMX-200</option> <option>Teléfono ALSTER</option> <option>Teléfono MOVILON</option> </select> <input type="submit" name="botEnviar" value="Enviar"> </form> <?php } else { } ?> </body> </html>

El código escrito ya es conocido por usted. Comprobamos si es la primera vez que se ha accedido a la página y, en ese caso, mostramos el formulario con la lista y el botón. En el caso de que ya hayamos pulsado en el botón para enviar la información, deberemos escribir el código que nos calcule el total a facturar y lo imprimiremos en la página. Esto se escribirá en la sección else:
switch ($_POST["Productos"]) { case "Placa MMX-100": $_SESSION["Total"] = $_SESSION["Total"] + 700; break; case "Placa MMX-200": $_SESSION["Total"] = $_SESSION["Total"] + 1400; break; case "Teléfono ALSTER": $_SESSION["Total"] = $_SESSION["Total"] + 850; break; case "Teléfono MOVILON": $_SESSION["Total"] = $_SESSION["Total"] + 623; break; } echo "<p>Total a facturar: " . $_SESSION["Total"] . "</p>"; echo "<a href='" . $_SERVER["PHP_SELF"] . "'>Volver</a>";

Dependiendo del producto seleccionado, sumaremos al total a facturar una determinada cantidad.
4

Sesiones en PHP

Fíjese que esta cantidad es particular al usuario que está accediendo a la página web. Por ello, guardaremos el valor en el array $_SESSION. Puede ver cómo accedemos a ese array particular del usuario. En este caso creamos una variable en ese array de nombre Total. Por lo tanto, tendremos en la variable Total del array $_SESSION, el valor total a facturar al usuario. Fíjese lo fácil que es acceder y modificar la información de la sesión gracias a la presencia del array $_SESSION. Después veremos cómo se guarda realmente esa información pero para nosotros, como programadores, realmente no nos hace falta nada más que conocer la existencia de este array. Además, hemos incluido un hipervínculo para volver a la página inicial. Pero todavía nos falta un detalle, que es iniciar la sesión. Para ello, se utiliza la función session_start:
<?php session_start(); if (!$_POST) { ..... Resto de la página ....................

Con esta función iniciamos una sesión. Fíjese que lo tenemos que hacer explícitamente porque, por defecto, la configuración de PHP no da soporte a las sesiones. Esto es útil para indicar en qué páginas es necesario utilizar sesiones y en cuáles no. Si su sitio web necesita que todas las páginas utilicen sesiones, será mejor cambiar la configuración de PHP para que se inicie la sesión automáticamente en cada página, como ya veremos. Al cerrar el navegador, la cookie que identifica la sesión se pierde ya que por defecto se mantiene sólo en la memoria del navegador. Esto quiere decir que el servidor no va a poder identificar al navegador, por lo que le proporcionará una nueva cookie, iniciando una nueva sesión con su correspondiente array $_SESSION.

Copyright (c) Computer Aided Education S.A.

5

Sesiones en PHP

La duración o tiempo máximo (timeout) de la sesión se establece en la directiva session.gc_ maxlifetime del archivo php.ini.

Sin embargo, la anterior sesión sigue existiendo en el servidor, lo que quiere decir que estamos guardando información que nunca podremos volver a utilizar ya que se ha perdido la cookie que la identificaba. Esa información almacenada en $_SESSION se destruirá cuando transcurra el tiempo máximo (timeout) sin que se haya vuelto a realizar una petición en dicha sesión.

3. FINALIZAR LA SESIÓN Hay dos formas principales de finalizar una sesión: El servidor finaliza la sesión transcurrido el tiempo máximo sin que se haya vuelto a realizar una petición. Utilizando la función session_destroy( ). Por lo tanto, vemos que cerrar el navegador no afecta en nada a la sesión, que se mantiene abierta en el servidor, con el correspondiente consumo de recursos en éste. Está claro que debemos evitar esta circunstancia siempre que sea posible. Para ello, lo mejor es proporcionar una forma para que el usuario decida finalizar la sesión, como un botón “Desconectar” (fíjese en la imagen adjunta).

6

Sesiones en PHP

<?php } else { if (IsSet($_POST["botDesconectar"])) { session_destroy(); echo "<p>Sesión finalizada</p>"; } else { switch ($_POST["Productos"]) { ...........Resto de la página..................

La forma más rápida de eliminar todas las variables de sesión es vaciar el array $_SESSION con la instrucción $_SESSION = array().

La función session_destroy destruye todos los datos guardados en la sesión, aunque siguen estando disponibles en la página actual. Si no queremos que sea así, deberíamos utilizar unset para eliminar esas variables. Tampoco elimina la cookie de identificación, que desaparecerá cuando se cierre el navegador. Esta función devuelve TRUE si se ha destruido la sesión correctamente y FALSE si ha habido algún problema al intentarlo. Utilizando el botón Desconectar destruiremos la información de la sesión, pero no así la cookie que identificaba esa sesión, ya que está en la memoria del navegador. Esto quiere decir que, si seguidamente (sin cerrar el navegador) vuelve a realizar una petición, el navegador seguirá enviando la misma cookie, por lo que el servidor iniciará una nueva sesión, con un nuevo array $_SESSION, pero utilizando la misma cookie de identificación, ya que está libre. Después veremos que la información de sesión se puede almacenar de distintas formas, pero, por defecto, se hace como archivos en un lugar del servidor. Esto hace que esa información no se pierde aunque reiniciemos el servidor web, lo que es una gran ventaja.

Copyright (c) Computer Aided Education S.A.

7

Sesiones en PHP

4. EL IDENTIFICADOR DE LAS SESIONES

R

epasando lo que hemos visto hasta ahora referente a las sesiones vemos que:

Las sesiones tienen un identificador que se guarda, por defecto, en una cookie que recibe el navegador la primera vez que se crea la sesión y que viaja con cada página a partir de ese momento para identificar esa sesión. Para acceder a la información almacenada en la sesión se utiliza el array superglobal $_SESSION. Vamos a ver más detalles referentes a la forma de identificar las sesiones. Por ejemplo, veamos el significado de las distintas directivas de configuración que aparecen en el archivo php.ini respecto a la cookie de sesión: - session.save_path: aquí se especifica la ubicación donde se almacenará la información de sesión. Después veremos que, inicialmente, esa información se almacena como un archivo de texto por sesión, pues aquí se indicaría dónde se guardan esos archivos. Es importante que la ubicación indicada en esta directiva esté fuera del espacio de documentos web del sitio, de forma que ningún usuario pueda acceder a él a través de su navegador. - session.use_cookies: aquí se indica si se podrán utilizar cookies para identificar la sesión. El valor 1 indica que sí, mientras que el valor 0 impediría que se utilizaran cookies para este propósito. - session.name: aquí indicaremos el nombre de la cookie que se utiliza para identificar las sesiones. Por defecto, el nombre es PHPSESSID y la verdad es que no tiene sentido cambiarlo excepto en el caso de que tengamos más de un sitio web en el mismo servidor y necesitemos diferenciar las sesiones de cada uno de ellos. - session.autostart: ¿recuerda que tuvimos que iniciar explícitamente la sesión con la función session_start en el código de la página? Bien, si establecemos la directiva session.autostart al valor 1, entonces esto no será necesario ya que se iniciará una sesión automáticamente al solicitar cualquier página php del sitio web. Es como si incluyéramos una llamada a la función session_start al principio de cada página.
8

Sesiones en PHP

Es importante entender el efecto de la función session_start para evitar cualquier confusión por su nombre. El efecto de esta función varía si PHP puede encontrar un identificador de sesión válido o no. Si lo encuentra, entonces entiende que la sesión ya está iniciada, por lo que simplemente pone a disposición de la página la información almacenada en el array $_SESSION para dicha sesión. Sin embargo, si no hay un identificador de sesión disponible, asume que se trata de la primera solicitud de la sesión y crea dicho identificador. Por lo tanto, no hay ningún problema en llamar más de una vez a esta función.

- session.cookie_lifetime: aquí indicamos el período de vigencia de la cookie que identifica la sesión. Si se establece al valor 0, entonces se tratará de una cookie que sólo se almacena en la memoria del navegador; mientras que un valor distinto haría que se almacenara en el disco duro del usuario durante su vigencia. Recuerde que si la cookie se almacena en la memoria del navegador, se eliminará al cerrarlo. - session.cookie_path: aquí indicamos para qué directorios será válida la cookie que identifica la sesión. Por ejemplo, podríamos desear utilizar la información de sesión sólo en un subdirectorio y no en todas las páginas del sitio web, como es el valor predeterminado (/). Pero, ¿qué ocurre si el usuario ha configurado su navegador para no permitir las cookies? Esto depende de la configuración de la directiva session.use_trans_sid. Si se establece a 1, entonces PHP busca otra forma de identificar la sesión, que es pasándola a través de la URL de la página o como un campo oculto de un formulario. Por defecto la configuración de esta directiva es que está desactivada, pero si la activamos, PHP pasará mediante Get o Post el identificador de la sesión: En los hipervínculos añade el identificador de la sesión, de forma que éste se envía junto a la URL de la página de destino, como puede ver en la figura de la página siguiente.
Copyright (c) Computer Aided Education S.A.

9

Sesiones en PHP

Si lo que hacemos es enviar la información mediante un formulario utilizando el método Post, utilizará un campo oculto para pasar el identificador de sesión. Recuerde que PHP utilizará estos métodos alternativos para identificar la sesión sólo cuando no se permitan las cookies y si hemos habilitado la directiva session.use_trans_sid. Primero siempre intenta utilizar cookies, ya que es un método mucho más seguro que pasar el identificador de la sesión bien mediante la URL de la página (Get) o mediante un campo oculto en un formulario (Post). Debe sopesar muy seriamente habilitar o no la directiva session.use_trans_sid: Si no la habilita, será necesario que los usuarios acepten sus cookies. Si la habilita, podrá utilizar la información de la sesión incluso aunque el usuario no acepte cookies, pero representa un riesgo adicional en cuanto a la seguridad porque el identificador de la sesión está visible. 5. ¿DÓNDE SE ALMACENA LA INFORMACIÓN? inalizaremos la lección comprobando dónde se almacena físicamente la información de las distintas sesiones que se establecen.

F

10

Sesiones en PHP

Tenga en cuenta que un sitio web concurrido manejará muchas sesiones simultáneamente, por lo que es importante poder identificarlas de forma que el usuario reciba el contenido web a partir de la información particular que para su sesión se ha guardado en el servidor. La forma en que el servidor web guarda la información de sesión viene dada por el valor de la directiva session.save_handler del archivo php.ini. Esta directiva puede tomar tres valores: - files: es el valor predeterminado e indica que la información de sesión se almacenará en forma de archivos. - mm: indica que se guardará en la memoria RAM del servidor. - user: permite establecer una forma de almacenar la información “personalizada”. Por ejemplo, en una base de datos. Adicionalmente, la directiva session.save_path indica la ubicación donde se almacenarán los archivos si utilizamos el método predeterminado. El paquete XAMPP configura la ubicación c:\apachefriends\xampp\tmp.

Aquí puede ver esos archivos de sesión. Se trata de archivos de texto planos que se irán eliminando de forma más o menos rápida en función de si utilizamos la función session_destroy o esperamos a que PHP los elimine para las sesiones caducadas. También influye mucho el valor de las directivas session.gc_probability y session.gc_dividend, del archivo php.ini, ya que establecen la probabilidad (en porcentaje) de eliminar los archivos de sesiones caducadas o finalizadas cada vez que se crea una nueva sesión.

Copyright (c) Computer Aided Education S.A.

11

Sesiones en PHP

Como puede ver, es importante que esta ubicación esté debidamente protegida en el servidor web porque aquí es donde se almacenará la información manejada en las distintas sesiones de los usuarios que acceden a nuestro sitio web.
En ocasiones, los usuarios acceden a Internet compartiendo una conexión, como una línea ADSL o de cable, a través de un software especial que se llama proxy. Un proxy permite compartir una conexión por varios usuarios, que no se dan cuenta de esta circunstancia (excepto, tal vez por la velocidad de acceso), ya que acceden a Internet normalmente. El proxy puede almacenar páginas visitadas en su propia memoria caché y proporcionarlas a otros usuarios que las soliciten posteriormente, de forma que el acceso a una misma página sea más rápido, sin necesidad de volver a cargarla ni de pedirla al servidor web original. Aquí es donde puede producirse un problema: que un usuario obtenga una página dinámica correspondiente a la petición (sesión) de otro usuario. Para evitar esta circunstancia, podemos utilizar la directiva session.cache_limiter en el archivo php.ini o la función session_cache_limiter en las páginas que así lo necesitemos. En cualquier caso, deberíamos establecer este detalle al valor nocache para que las páginas no se almacenaran en la caché del proxy: session.cache_limiter = nocache o session_cache_limter("nocache"); //archivo php.ini //Utilícela antes //de session_start()

12