¿Qué son las sesiones?

Si existe una consulta repetida en las listas de PHP, es la relativa al uso de las sesiones. El uso de sesiones es un método ampliamente extendido en cualquier aplicación de cierta entidad.

Si existe una consulta repetida en las listas de PHP, es la relativa al uso de las sesiones. El uso de sesiones es un método ampliamente extendido en cualquier aplicación de cierta entidad. Básicamente una sesión es la secuencia de páginas que un usuario visita en un sitio web. Desde que entra en nuestro sitio, hasta que lo abandona.

El término sesión en PHP, session en inglés, se aplica a esta secuencia de navegación, para ello crearemos un identificador único que asignamos a cada una de estas sesiones de navegación. A este identificador de sesión se le denomina, comúnmente, como la sesión.

El proceso en cualquier lenguaje de programación podría ser algo así:

Existe una sesión?
Si existe la retomamos
Si no existe creamos una nueva
Generar un identificador único

Y para que no perdamos el hilo de la navegación del usuario deberemos asociar esta sesión a todas las URLs y acciones de formulario. Podemos también crear un cookie que incluya el identificador de sesión, pero es conveniente recordar que la disponibilidad o no de las cookies depende del usuario, y no es conveniente fiarse de lo que un usuario pueda o no tener habilitado.

Lo contado hasta ahora es teoría pura y es aplicable a cualquier lenguaje de programación C, Perl, etc. Los que programamos en PHP4 tenemos la suerte de que toda la gestión de sesiones la hace el mismo PHP.

Por lo tanto lo comentado a partir de aquí es solo aplicable a PHP4. Si aún desarrollas PHP3, tendrás que crear tus propias librerías de gestión de sesiones o recurrir a alguna de las existentes, como la de PHPLIB.

Publicado originalmente en Webestilo alrededor de 2000

Para utilizar sesiones en PHP lo primero es inicializarlas. Podemos hacerlo explícitamente, mediante la función session_start(), o al registrar una variable en una sesión mediante session_register('miVariable'). En ambos casos se crea una nueva sesión, si no existe, o se retoma la sesión actual. Veamos un sencillo ejemplo:

<?php // Manual de PHP de WebEstilo.com`

session_start();
echo "He inicializado la sesión";
?>

Esta es la forma más básica, si el usuario tiene los cookies activados, PHP habrá insertado de forma automática la sesión y ésta será pasada de una página a otra sin hacer nada más. Desde un punto de vista práctico la sesión es operativa, pero no vemos nada. Podemos obtener la sesión en cualquier momento mediante la función session_id(). Inserta en las sucesivas páginas la siguiente línea para ver si la sesión está disponible:

<?php // Manual de PHP de WebEstilo.com`

session_start();
echo 'La sesión actual es: '.session_id();
?>

En este caso session_start() comprueba en los cookies que existe una sesión y continua con ella, session_id() devuelve el identificador actual.

Veamos otro ejemplo que, tal vez, te lo aclare un poco más:

<?php // Manual de PHP de WebEstilo.com`

session_register('contador');
echo '[Contador vale: '.++$_SESSION['contador']. '](http://josevalle.com/'.$PHP_SELF.'?'.$SID.')';
?>

Como dije anteriormente la sesión se crea o recoge mediante session_start(), o también cuando se registra una variable de sesión mediante session_register().

Si no has utilizado nunca las sesiones, el concepto de variable de sesión, puede resultar un poco abstracto. Básicamente es una variable, como cualquiera de las que gestiona PHP4, pero que reside en un espacio específico en el servidor, junto con el identificador de sesión, y que pertenece únicamente a un usuario.

En nuestro ejemplo anterior, registramos la variable $contador en la primera línea del script. En la segunda línea, entre otras cosas, cada vez que recarguemos la página o hagamos click sobre el enlace, el valor de $contador se incrementará en 1.

En esta línea hacemos uso de la variable reservada $PHP_SELF, que hace referencia al propio script en ejecución y una constante propia de PHP4, $SID, que contiene el nombre de la sesión y el identificador de la misma.

Podemos averiguar también el nombre de la sesión, o modificarlo, mediante la función session_name(). Veamos una prueba práctica:

<?php // Manual de PHP de WebEstilo.com
session_name('misesion');
session_register('contador');
echo 'Contador vale: '.++$_SESSION['contador'].'';
echo 'Ahora el nombre es '.session_name().' y la sesión '.$misesion.'';
?>

La asignación del nombre de sesión debe realizarse antes que ninguna otra función con sesiones, antes que session_start() o session_register().

Uno de los errores más comunes cuando se utilizan sesiones es dejar líneas en blanco antes de la inicialización de PHP o enviar alguna salida a la pantalla. Para probarlo crea una línea en blanco o con cualquier cosa antes de >?php.

Si tienes los cookies activados, te encontrarás un error de este tipo:

Warning: Cannot send session cookie - headers already sent by (output started at /home/session.php:2) in /home/session.php on line 4`

PHP está informando de que no puede activar los cookies en el navegador del usuario, porque las cabeceras ya han sido enviadas. Simplemente por la existencia de una línea en blanco. Como medida práctica, no dejes espacios ni antes del inicio del script, ni después de la finalización. Te ahorrará muchos disgustos.

Si después de todo lo comentado aún no entiendes para que sirven las sesiones, veamos un ejemplo práctico. Imagina que quisieras crear un sistema de cesta de la compra, en su forma básica podría ser algo así:

<?php 
// Manual de PHP de WebEstilo.com
session_start();
session_register('itemsEnCesta');
$item=$_POST['item'];
$cantidad=$_POST['cantidad'];
$itemsEnCesta=$_SESSION['itemsEnCesta'];`

if ($item){
  if (!isset($itemsEnCesta)){
    $itemsEnCesta[$item]=$cantidad;
  }else{
    foreach($itemsEnCesta as $k => $v){
    if ($item==$k){
      $itemsEnCesta[$k]+=$cantidad;
      $encontrado=1;
    }
  }
  if (!$encontrado) $itemsEnCesta[$item]=$cantidad;
}

$_SESSION['itemsEnCesta']=$itemsEnCesta;
?>

<form method="post">
Dime el producto
Cuantas unidades

<?
if (isset($itemsEnCesta)){
  echo'El contenido de la cesta de la compra es:';
  foreach($itemsEnCesta as $k => $v){
  echo 'Artículo: '.$k.' ud: '.$v.'';
}
?>

Una breve explicación:

  • En la línea 4 comprobamos si el usuario ha pasado algún artículo, desde el formulario.
  • En la 5 si el array itemsEnCesta no existe, lo creamos con el nuevo producto y la cantidad indicada.
  • Si el array existe recorremos su contenido, entre las líneas 8 y 13.
  • Y si encontramos un artículo igual, añadimos la cantidad en la línea 10.
  • Si no lo encontramos, es un nuevo artículo, por lo tanto, añadimos el nuevo producto con la correspondiente cantidad a itemsEnCesta en la línea 14.
  • Y a continuación imprimimos el formulario y los resultados, si los hubiera, a partir de la línea 18, donde empieza el HTML.

¿Te imaginas las posibilidades de un sistema de almacenamiento de información de estas características?. No necesitas ficheros, ni bases de datos, ni tienes que andar pasando valores de una página a otra. PHP va gestionando estos datos por nosotros, hasta el momento en que decidamos almacenar la información donde más nos interese.

Estas son las funcionalidades básicas de las sesiones, espero que te haya resultado ilustrativo y no olvides consultar el resto de funciones asociadas al uso de sesiones en el manual de PHP.


Recuperado del antiguo foro de tontos.com Revisado el 12 octubre de 2002.

Publicado originalmente en Webestilo alrededor de 2000


Comentarios

Los nuevos comentarios se moderan antes de mostrarse públicamente.

Todavía no hay comentarios aprobados.

Deja un comentario

Necesitas una cuenta para participar en la conversación. Accede o regístrate para comentar.

Registrarse

Leer a continuación

Más piezas del mismo flujo editorial.

Cómo cambia el comportamiento de los usuarios a causa de Internet

Cómo cambia el comportamiento de los usuarios a causa de Internet

Tecnología, Sociedad

El impacto de Internet, de las redes sociales, en nuestras vidas y comportamiento, está siendo más profundo de lo que parece. Aunque algunos efectos, sobre todo entre los más jóvenes, ya son claramente apreciables. Mientras que la cibercrastinación nos afecta a todos por igual.

Niños etíopes aprenden con unos tablets por sí mismos, sin profesores

Niños etíopes aprenden con unos tablets por sí mismos, sin profesores

Tecnología, Sociedad

Hoy comentaba con un viejo amigo, ¿verdad Manuel? como cambiará el mundo cuando un cabrero keniata pueda estudiar en el MIT mediante su smartphone. Un tema apasionante.

Problemas con un ASUS T101MT, vamos con Apple

Problemas con un ASUS T101MT, vamos con Apple

Tecnología, Sociedad

Las grandes empresas siguen prácticas que realmente me sorprenden, en este caso el protagonista es ASUS, que pretende que un netbook de cerca de 500 euros, con menos de 3 años, lo tire a la basura, porque no tienen baterías.