Ver índice
Sesiones

        Ocultar índice  

   Índice de contenidos
   Instalación en Windows
   Instalación en Ubuntu
   Servidores seguros
   Páginas dinámicas
   Sintaxis básica
   Operaciones
   Arrays
   Formatos de presentación
   Operadores
   Bucles
   Extraer y ord. información
   Funciones
   Ficheros externos
   Imágenes dinámicas
   Gestión de directorios
   Cookies y sesiones
   Clases y objetos
   Ficheros en formato PDF
   Bases de datos MySQL
   PHP y XML
   PDO - Bases SQLite / MySQL
   MySQL a traves de misqli
   Algo de JavaScript y AJAX


¿Qué son las sesiones?

Suponemos que habrás estado alguna vez en un hotel y que recuerdas que al inscribirnos como huéspedes nos facilitan una tarjetita identificativa que teóricamente habríamos de presentar a la hora de solicitar cualquier servicio del hotel (cafetería, restaurante, etc.).

Al registrarnos en ese hotel estaremos iniciando una sesión (estancia) y al recibir la tarjeta identificativa se nos estará facilitando un identificador de sesión, que tiene validez temporal, ya que expirará en la fecha de salida indicada en ella y que recoge una serie de datos (nuestros datos personales, nuestro período de estancia, el precio y los servicios contratados, etcétera).

Imaginemos ahora que vamos al restaurante. Pueden ocurrir dos cosas: que decidamos efectuar el pago directamente, o que pidamos que el importe de la factura se incluya en nuestra cuenta. En el segundo de los casos, se reiniciará la sesión y se registrará una nueva variable de sesión –el importe del servicio– al firmar la nota de cargo del mismo.

El responsable del restaurante deberá guardar en algún sitio (probablemente en la oficina de recepción) esa nota de cargouna variable de sesión– de forma temporal ya que una vez abonado su importe o en el momento que abandonemos el hotel expirará la sesión y dejará de tener utilidad. Se requiere de forma imprescindible un directorio temporal en el que almacenar las variables de sesión.

En PHP la sesiones funcionan de forma muy similar y de esa similitud surge la necesidad de habilitar un directorio temporal antes de utilizar sesiones. Si visualizamos el fichero info.php y buscamos la directiva session.save_path veremos que, en el caso de Windows tiene el valor C:/ServidoresLocales/tmp como consecuencia de la creación del directorio tmp y de la modificación que hicimos en la línea 1471 de php.ini cuando detallábamos el proceso de configuración de php (puedes verlo aquí).

En el caso de la instalación sobre Ubuntu esa configuración se hace de forma automática. Al observar info.php podrías ver que: session.save_path="/var/lib/php5"

La posibilidad de propagación de las sesiones y con ellas la información guardada en las variables de sesión ($_SESSION) son instrumentos de enorme utilidad en la gestión de de páginas web.

Funciones de sesión

Para la gestión de sesiones se utilizan estas funciones:

session_start()

Crea una sesión o continúa con la actual. En el segundo caso el identificador de sesión debe ser tranferido por medio de una variable GET o a través de una cookie.

session_name()

Recoge el nombre de la sesión. Si no se asigna uno de forma explícita utiliza como nombre de sesión el contenido de la directiva session.name del fichero php.ini. Por defecto ese nombre suele ser PHPSESSID, pero no está de más comprobarlo mirando el valor actual de la directiva session.name en info.php.

session_name('nombre')

Esta variante de la función anterior permite asignar un nuevo nombre a la sesión actual. Debemos tener en cuenta que si cambiamos de página y queremos mantener el mismo identificador (conservar la sesión anterior) esta función debe ser incluida con el mismo nombre en la nueva página y, además, ha de ser insertada antes de que la función session_start() se invocada para iniciar la sesión.

session_cache_limiter()

El limitador de caché controla las cabeceras HTTP enviadas al cliente. Estas cabeceras determinan las reglas mediante las que se habilita la opción de que los contenidos de las páginas puedan ser guardados en la caché local del cliente o se impida tal almacenamiento.

En este último modo –no caché– cada petición de página requeriría una nueva llamada al servidor, lo cual tiene –como todo en la vida– ventajas e inconvenientes. Entre las ventajas está la garantía de que en cada acceso estamos viendo la versión actualizada de la página, cosa que podría no ocurrir de otro modo. El inconveniente es que requiere una nueva petición que puede significar un tiempo de espera, mientras el servidor produce la respuesta. Esta opción viene configurada por defecto en las directivas de configuración del php.ini como nocache.

Para evitar –sea cual fuera la configuración de php.ini– el almacenamiento de las páginas en la caché del cliente hemos de utilizar:

session_cache_limiter ('nocache,private')

Igual que ocurría con session_name, si utilizamos está función debemos escribirla antes que session_name y –también igual que en aquel caso– deberemos repetirla en cada uno de los documentos. Por tanto, el orden de escritura de estas instrucciones sería el siguiente:

<?php
session_cache_limiter();
session_name('nombre');
session_start();
.....
?>

Es muy importante mantener ese orden y que este bloque de instrucciones sea el primer elemento de la página –antes de cualquier otra etiqueta– y que no haya líneas en blanco ni antes de la etiqueta <?php ni entre ella y las llamadas a estas funciones.

Propagación de las sesiones

La verdadera utilidad de las sesiones estriba en su propagación, es decir, la posibilidad que tanto el identificador de sesión como los valores de las variables de sesión –luego hablaremos de estas variables– puedan ir pasando de una página a otra sin necesidad de recurrir al uso de formularios. Para entendernos, se trata de dar validez y utilizar la misma tarjeta para movernos por las diferentes secciones del hotel que hemos utilizado como ejemplo.

La forma habitual de propagar las sesiones es a través de cookies, pero como quiera que el usuario tiene la posibilidad de desactivar la opción (no aceptar cookies) PHP dispone una opción alternativa que permite la propagación a través de la URL aún en el caso de que las cookies estén desactivadas.

Caso de que el cliente tenga activada la opción aceptar cookies

Si queremos que las sesiones se propaguen únicamente en el caso de que esté activada la opción aceptar cookies en el navegador bastará con hacer la llamada a la nueva página siguiendo el método tradicional, es decir:

<A href="pagxx.php">

y que esa nueva página contenga sin que lo preceda ninguna línea en blanco el script siguiente:

<?
session_cache_limiter();
session_name('nombre');
session_start();
.....
?>

donde no es imprescindible incluir session_cache_limiter pero cuando se incluye ha de ir como primera línea del script. Con session_name ocurre algo similar. Si la sesión fue iniciada con un nombre distinto al que le asigna por defecto PHP, debemos escribir session_name('nombre'), y además, nombre debe tener el mismo valor que en la página precedente.

Si no se asigna ningún nombre tomará el valor PHPSESSID –nombre por defecto– en todas las páginas y no será necesaria la instrucción session_name.

Caso de cookies deshabilitadas

Para garantizar la propagación de las sesiones –aún cuando el navegador esté configurado para no aceptar cookies– tendremos que pasar el identificador de sesión junto con las llamadas a las páginas siguientes. Para ello se requiere la siguiente sintaxis:

<A href="pagxx.php?<?php print echo session_name()."=".session_id():?>"

Con esta sintaxis, después de escribir el ? (recordemos que es la forma de indicar que añadimos variables y valores para que sean transferidos junto con la petición de la página) estaremos pidiendo a PHP que escriba como nombre de variable el nombre de la sesión y como valor de esa variable, después de insertar el signo igual, el identificador de sesión.

Es evidente que la utilización de esta opción nos permite asegurar que las sesiones y sus variables podrán ser usadas sin riesgos de que una configuración inadecuada por parte del cliente produzca resultados imprevisibles.

Algunos ejemplos

Aquí tenemos un ejemplo de como iniciar una sesión y también podremos comprobar como se propaga al llamar a la misma página si está activada la opción aceptar cookies. Si ejecutamos reiteradamente el script –pulsando en volver a llamar esta página– podremos ver que no se modifica el valor del identificador de sesión.

Si bloqueamos las cookies (en este enlace está descrito el procedimiento para hacerlo) podremos comprobar que ahora la sesión no se propaga y que cada vez que volvemos a llamar a la página nos aparece un nuevo valor en el identificador de sesión, es decir, se crea una nueva sesión.

<?php
session_start();
#pedimos que escriba el identificador único y el nombre de la sesión
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo273.php">Volver a llamar estallamar esta página</A>
ejemplo273.php

Ahora haremos una modificación importante en el script. Al incluir en la llamada a la página el nombre y el identificador de sesión estamos transfiriendo –mediante el método GET– el valor de esa variable. De esta forma, la propagación de la sesión estará asegurada sea cual fuere la configuración del navegador del cliente.

Podemos comprobar –activando/desactivando cookies– que en las sucesivas llamadas a la página se mantiene el identificador de sesión.

<?php
session_start();
#pedimos que escriba el identificador único y el nombre de la sesión
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo275.php?<?php echo session_name()."=".session_id();?>">Volver a  esta página</a>
ejemplo275.php

Sesiones con nombre propio

En los ejemplos siguientes se crean y propagan sesiones con nombre propio sin que ello altere las condiciones de respuesta con las opciones aceptar /no aceptar cookies. También hemos incluido session_cache_limiter con las restricciones de nocache con lo cual el navegador no guardará las páginas de ejemplo en la caché. Si cambiáramos los parámetros (nocache, private por public) podríamos comprobar si se almacena en la caché del navegador la página web devuelta por el servidor.

<?php
session_cache_limiter('nocache,private');
session_name('leocadia');
session_start();
#pedimos que escriba el identificador único
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo276.php">Volver a llamar esta página</A>
ejemplo276.php
<?php
session_cache_limiter('nocache,private');
session_name('leocadia');
session_start();
#pedimos que escriba el identificador único
echo session_id(),"<br>";
echo session_name(),"<br>";
?>
<A Href="ejemplo278.php?<?php echo session_name()."=".session_id()?>">Volver a esta página</A>
ejemplo278.php

Las cookies de sesión y sus parámetros

Para el caso de que el navegador del cliente tenga activada la opción de aceptar cookies PHP dispone de una función que permite leer los parámetros de esa cookie. Es la siguiente:

session_get_cookie_params() que devuelve un array asociativo con los siguientes índices:

Los valores por defecto para estos parámetros se pueden establecer en la configuración del fichero php.ini. Si visualizamos info.php podremos ver –en las directivas session.cookie_xxx nuestros valor por defecto– y observaremos que session.cookie_lifetime tiene valor 0, razón por la cual si –con la opción aceptar cookies activada– ejecutamos cualquiera de los script anteriores y miramos el directorio Temporal Internet Files, no encontraremos ninguna de estas cookies, dado que su plazo de expiración es cero.

<?php
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
# recogemos en la variable $a el array con los datos de la sesión
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo279.php">Volver a llamar esta página</a>
ejemplo279.php
<?php
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
# recogemos en la variable $a el array con los datos de la sesión
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo281.php?<?php echo session_name()."=".session_id()?>">Volver a esta página</A>
ejemplo281.php

Las configuraciones de session.cookie pueden cambiarse sin necesidad de modificar el fichero php.ini. Para ello disponemos de la función:

session_set_cookie_params(duración ,'path','dominio',segura)

que permite configurar esos parámetros de forma temporal –unicamente para la página en la que está insertado– y que como en los casos anteriores puede configurarse sólo para el caso de que el navegador acepte cookies como para las situaciones en la que esa opción esté deshabilitada.

En estos ejemplos escribirá –siempre que esté configurada la opción aceptar cookies en el navegador del cliente– una cookie que tendrá una caducidad de DIEZ minutos (el valor 10 de session_set_cookie_params).

   Esa cookie se guardará en el mismo directorio (/) donde se guardan las páginas web visitadas (el famoso C:\WINDOWS\Temporary Internet Files, en la configuración por defecto de IE), pero..., eso solo ocurrirá si –tal como ves en el ejemplo– pones en el parámetro dominio el nombre real del dominio donde está alojada la web.

Si el nombre de dominio no coincide con que alberga la página –razonable criterio de seguridad– no se guardará la cookie.

<?php
session_set_cookie_params (10,"/","localhost", 0);
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo282.php">Volver a llamar esta página</A>
ejemplo282.php
<?php
session_set_cookie_params (10,"/","localhost", 0);
session_name('mi_sesion');
session_start();
echo session_id(),"<br>";
echo session_name(),"<br>";
$a=session_get_cookie_params();
foreach($a as $c=>$v){
	echo $c,"--->",$v,"<br>";
}
?>
<A Href="ejemplo284.php?<?php echo session_name()."=".session_id()?>">Volver a esta página</A>
ejemplo284.php

Manejo de variables de sesión

Las funciones más importantes para el manejo de variables de sesión son las siguientes:

$_SESSION['variable']=valor

es una de las formas de definir una variable de sesión. El índice variable debe contener –entre comillas– el nombre que pretendamos asignarle a esa variable de sesión y valor sería el valor asignado a esa variable. Si ya existiera le reasignaría el nuevo valor.

unset($_SESSION);

La función unset destruye las variables contenidas en el paréntesis. En este caso, al contener el array $_SESSION destruiría todas las variables contenidas en él.

unset($_SESSION['variable']);

Es similar a la anterior. En este caso solo sería destruida el elemento del array cuyo índice sea var.

isset($_SESSION['variable']);

La función isset –no es específica del tratamiento de sesiones– devuelve un valor booleano (UNO ó NUL) según que exista o no exista la variable contenida en el paréntesis. De hecho, se comporta con las variables de sesión de forma idéntica a como lo haría con cualquier otro tipo de variable.

<?php
# iniciamos la sesión
session_start();
# visualizamos el identificador de sesión
print "Este es el identificador de sesion: ".session_id()."<br>";
# registramos una variable de sesión asignandole un nombre
$_SESSION['variable1']="";
#asignamos un valor a esa variable de sesión
$_SESSION['variable1']="Filiberto Gómez";
/* registramos una nueva variable de sesión asignandole directamente un valor */
$_SESSION['variable2']="Otro filiberto, este Pérez";
#comprobamos la existencia de la variables de sesión
@print "Mi_variable1 esta registrada: ".isset($_SESSION['variable1'])."<br>";
#leemos el contenido de esa variable
  @print "Su valor es: ".$_SESSION['variable1']."<br>";
#comprobamos la existencia de la otra variable y la visualizamos
@print "Mi variable2 esta registrada :".isset($_SESSION['variable2'])."<br>";
print $_SESSION['variable2']."<br>";
#destruimos la variable1
unset($_SESSION['variable1']);
@print  "La variable1 ha sido destruida:".isset($_SESSION['variable1'])."<br>";
@print $_SESSION['variable1']."<br>";
#destruimos todas las variables restantes
unset($_SESSION);
#comprobamos que han sido destruidas

@print "La variable1 ya estaba vacia: ".isset($_SESSION['variable1'])."<br>";
@print $_SESSION['variable1']."<br>";

@print "También ha sido destruida la variable2: ".$_SESSION['variable2']."<br>";
@print $_SESSION['variable2']."<br>";

?>
ejemplo285.php

Propagación de sesiones

Los tres scripts siguientes son un ejemplo del uso de sesiones para la propagación de sesiones. Funcionan bajo cualquier forma de register_globals y también en el caso en que las cookies estuvieran desactivadas en el navegador del cliente

<?php
/* recuerda que entre <?php y la primera línea no puede haber
   líneas en blanco ni tampoco puede haberla encima de <?
   aunque como en este caso, si admite líneas de comentario
   pero no líneas en blanco */
# deactivamos la opcion de que las páginas puedan guardarse
# en la cache del navegador del cliente
session_cache_limiter('nocache,private');
# le asignamos un nombre a la sesión
# aunque lo habitual sería dejar el nombre por defecto
# que le asigna la configuración de php.ini
session_name('pruebas');
# iniciamos la sesion
session_start();
# creamos variables de sesion y les asignamos valores
$_SESSION['valor1']=25;
$_SESSION['valor2']="Ambrosio de Morales";
$_SESSION['variable3']="Una prueba más";
/* cerramos el script e insertamos un enlace a otra página
   y propagamos la sesión incluyendo en la llamada
   el nombre de la session y su identificador
   En esta página no se visualizaría nada. Solo el enlace */
?>
<A Href="ejemplo287.php?<?php echo session_name()."=".session_id()?>">Propagar la sesion</A>

ejemplo286.php
<?php
/* pese a que la sesion viene de la página anterior
   tenemos que poner nuevamente session_cache_limiter
   ya que esta instruccion no se conserva
   solo es válida para la página en la que esta definida
   También tenemos que poner en session_name el mismo
   nombre de la página anterior, de no hacerlo
   PHP entendería que se trata de iniciar una sesion distinta
   Por ultimo también debemos iniciar la sesión
   es obligatorio iniciarla */
session_cache_limiter('nocache,private');
session_name('pruebas');
session_start();
/* comprobaremos que la sesion se ha propagados
   visualizando el array asociativo $_SESSION
   que contiene todas la variables de Sesion */

foreach($_SESSION as $indice=>$valor){
	print("Variable: ".$indice." Valor: ".$valor."<br>");
}
# modificamos los valores de las variables de sesion
# de igual forma que si fueran variables de cualquier otro tipo

$_SESSION['valor1']+=87;
$_SESSION['valor2'] .=" bonito nombre";
# destruimos la tercera variable
unset($_SESSION['variable3']);

# propagamos la sesion a la página siguiente
# con identico proceso al del script anterior
?>
<A Href="ejemplo288.php?<?php echo session_name()."=".session_id()?>">Propagar la sesion</A>

<?php
# identicos comentarios a los anteriores
session_cache_limiter('nocache,private');
session_name('pruebas');
session_start();
# este bucle nos confirmará que se han propagado
# los nuevos valores y que la tercera variable ha sido destruida
foreach($_SESSION as $indice=>$valor){
	print("Variable: ".$indice." Valor: ".$valor."<br>");
}
?>