# Sesiones

En esta lección se trata el manejo de sesiones en PHP:

## Introducción

Las sesiones son un mecanismo que utilizan los servidores web para guardar información sobre el usuario y su actividad y recuperarla cada vez que el navegador les pide una página.

Esta información esta disponible como mucho hasta que el usuario cierre el navegador.

La diferencia con respecto a las cookies es que mediante cookies la información se guarda en el ordenador del usuario y se envía en cada petición al servidor, mientras que mediante sesiones la información se guarda en el servidor. En el manual de PHP se ofrece un capítulo dedicado a las sesiones.

El trabajo con sesiones tiene tres partes:

- Creación o apertura de la sesión

  Cuando alguna página crea una sesión utilizando la función correspondiente, el servidor asocia al navegador del usuario un identificador de usuario único. El identificador se guarda en el usuario en forma de cookie o, si no se permite la creación de cookie, añadiendo el identificador en la dirección de la página.

- Utilización de la sesión

  Una vez creada la sesión, las páginas solicitadas por el mismo navegador pueden guardar y recuperar información en el servidor, información que se asocia al identificador de usuario, por lo que no es accesible a otros. La información se conserva hasta que el usuario o el servidor destruyan la sesión.

- Destrucción o cierre de la sesión

  Tanto el usuario como el servidor pueden cerrar la sesión. El usuario puede destruir la sesión cerrando el navegador. El servidor puede destruir la sesión cuando alguna página utilice la función correspondiente.

## Crear la sesión

En PHP, las sesiones se crean mediante la función session_start(). Si la sesión no existía, esta función crea la sesión y le asocia un identificador de sesión único. Si la sesión ya existía, esta función permite que la página tenga acceso a la información vinculada a la sesión.

Por ejemplo:

    <?php
    session_start();
    ?>

Como en el caso de las cookies, hay que tener la precaución de utilizar la función session_start() antes de empezar a escribir el contenido de la página, porque si no PHP producirá un aviso y no se creará la sesión. El motivo es que el idetificador de sesión se utiliza en las cabeceras de respuesta HTTP y las cabeceras se envían antes del texto de la página. Es decir, cuando PHP encuentra una instrucción que escribe texto, cierra automáticamente la cabecera; si a continuación PHP encuentra en el programa la función session_start(), da un aviso porque ya se han enviado las cabeceras y no se crea la sesión.

El ejemplo siguiente muestra código incorrecto, ya que utiliza la función setcookie() después de haber escrito texto, y el mensaje de aviso generado por PHP.

    <?php
    // Este código es incorrecto, la cabecera se crea después de crear texto
    print "<p>Hola</p>";
    session_start();
    ?>
| <p>Hola</p> Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at prueba.php:3) in prueba.php on line 5

Nota: En algunos casos este código incorrecto puede no generar un aviso y la cookie puede crearse, dependiendo de la configuración de la directiva output_buffering.

Volver al principio de la página

## Utilizar la sesión

Cuando una página ha creado una sesión o ha accedido a una sesión ya existente mediante session_start(), la página tiene acceso a la matriz $_SESSION que contiene las variables de esa sesión.

La matriz $_SESSION es una matriz asociativa en la que se pueden definir valores como en cualquier otra matriz. La diferencia es que $_SESSION es accesible desde páginas diferentes (siempre que esas páginas tengan asociada la misma sesión), manteniéndose los valores de una página a otra.

El ejemplo siguiente muestra dos páginas. La primera página guarda información en $_SESSION y la segunda la utiliza.

    <?php
    session_start();
    $_SESSION["nombre"] = "Pepito Conejo";
    print "<p>Se ha guardado su nombre.</p>";
    ?>
| <p>Se ha guardado su nombre.</p>
    <?php
    session_start();
    print "<p>Su nombre es $_SESSION[nombre].</p>";
    ?>
| <p>Su nombre es Pepito Conejo.</p>

Los valores de $_SESSION se borran como en cualquier otra matriz mediante la función unset().

    <?php
    session_start();

    if (isset($_SESSION["nombre"])) {
        print "<p>Su nombre es $_SESSION[nombre].</p>";
    } else {
        print "<p>No sé su nombre.</p>";
    }

    unset($_SESSION["nombre"]);

    if (isset($_SESSION["nombre"])) {
        print "<p>Su nombre es $_SESSION[nombre].</p>";
    } else {
        print "<p>No sé su nombre.</p>";
    }

    ?>
| <p>Su nombre es Pepito Conejo.</p> <p>No sé su nombre.</p>

Un detalle importante que distingue a las sesiones de las cookies es que:

- en el caso de las cookies, cuando una página pide al navegador que cree una cookie, el valor de la cookie no está disponible en $_COOKIE en esa página. Lo estará en páginas posteriores, cuando el navegadorlas pide otra página y envíe el valor en la petición.
- en el caso de las sesiones, cuando una página crea un valor en $_SESSION, ese valor está disponible en ese mismo página.

Es decir, que el siguiente programa siempre producirá el mismo resultado:

    <?php
    session_start();
    $_SESSION["nombre"] = "Pepito Conejo";

    if (isset($_SESSION["nombre"])) {
        print "<p>Su nombre es $_SESSION[nombre].</p>";
    } else {
        print "<p>No sé su nombre.</p>";
    }

    unset($_SESSION["nombre"]);

    if (isset($_SESSION["nombre"])) {
        print "<p>Su nombre es $_SESSION[nombre].</p>";
    } else {
        print "<p>No sé su nombre.</p>";
    }

    ?>
| <p>Su nombre es Pepito Conejo.</p> <p>No sé su nombre.</p>

Volver al principio de la página

## Destruir la sesión

El usuario puede destruir la sesión cerrando el navegador, pero las sesiones también se pueden destruir por programa mediante la función session_destroy().

Cuando se destruye una sesión, el programa que ha destruido la sesión sigue teniendo acceso a los valores de $_SESSION creados antes de la destrucción de la sesión, pero las páginas siguientes no. Si se ejecuta el primero de los ejemplos siguientes y después el segundo, se obtienen los resultados indicados:

    <?php
    session_start();
    $_SESSION["nombre"] = "Pepito Conejo";
    session_destroy();

    if (isset($_SESSION["nombre"])) {
        print "<p>Su nombre es $_SESSION[nombre].</p>";
    } else {
        print "<p>No sé su nombre.</p>";
    }
    ?>
| <p>Su nombre es Pepito Conejo.</p>
    <?php
    session_start();

    if (isset($_SESSION["nombre"])) {
        print "<p>Su nombre es $_SESSION[nombre].</p>";
    } else {
        print "<p>No sé su nombre.</p>";
    }
    ?>
| <p>No sé su nombre.</p>

Volver al principio de la página

Esta obra está bajo una licencia de Creative Commons.