Una sesión permite mantener y manejar información provista por los usuarios en el servidor. Técnicamente, es un array o arreglo multidimensional de múltiples tipos. Con una sesión, los datos ya no se pierden tan fácilmente de la memoria y podemos reutilizarlos tanto como lo necesitemos en nuestra aplicación. Las podemos encontrar implementadas en carritos de compra, puntos de venta, secciones privadas o protegidas de una página, inicios de sesión de una aplicación, etc.
Tabla de Contenido
Iniciando una nueva sesión en PHP
Para crear o iniciar una sesión en PHP, se utiliza la función session_start(), esta función existe desde PHP 4 y devuelve true si la sesión se inicio correctamente o, false en caso contrario. Su sintaxis es muy sencilla:
session_start();
Dado que es un boolean su valor de retorno, se puede guardar dentro de una variable para hacer una validación. En caso de que la sesión no pueda ser creada, podemos redirigir el flujo de salida hacia otro archivo, esto lo logramos con las funciones header, ob_start y ob_end_flush.
<?php
$iniciar = session_start();
if(!$iniciar){
ob_start();
header("Location: nosesion.html");
ob_end_flush();
}
?>
El archivo nosesion.html al que hacemos referencia, puede contener algo muy básico como esto:
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<title>SIN SESIÓN</title>
</head>
<body>
<h2>LO SENTIMOS</h2>
<p>Ha ocurrido un error, intenta más tarde.</p>
</body>
</html>
Desde la versión 7 de PHP, la función session_start() acepta un parámetro conocido como options. Este parámetro es una lista de valores de configuración en tiempo de ejecución que pueden modificar el comportamiento de la sesión. Son varios y se pueden consultar en su página oficial. Para usar estos valores, solo se elimina el prefijo session. Por ejemplo:
$iniciar = session_start([
'name' => "MISESION",
'cookie_lifetime' => 86400,
'use_only_cookies' => true,
'cookie_httponly' => true,
'use_strict_mode' => true
]);
Las opciones que hemos usado en este caso hacen lo siguiente:
- name: Cambia el nombre de la sesión de su valor default que es “PHPSESSID”, al valor que uno requiera.
- cookie_lifetime: Ajusta el tiempo de vida de la cookie que es enviada al navegador, en este caso se estableció a 1 día entero (60 segs x 60 mins x 24 horas)
- use_only_cookie: Permite que el id de la sesión se almacene en una cookie
- cookie_httponly: La cookie de la sesión solo se puede acceder desde HTTP, según la documentación oficial esto evita que se pueda utilizar desde JavaScript.
- use_strict_mode: Solo se pueden usar sesiones que se hayan iniciado correctamente.
Al momento, nuestro código va así:

Identificando nuestra sesión
Por supuesto, cada sesión debe tener un identificador único. Para lograr esto, tenemos tres funciones primordiales:
- session_create_id: Permite crear un ID nuevo, al que de manera opcional se le pueda añadir un prefijo.
- session_id: Establece un ID previamente definido o regresa el actual.
- session_regenerate_id: Reemplaza el ID de sesión por uno recién creado.
Como dato muy importante, dado que el ID es lo más básico para una sesión, se debe usar session_id() antes de la llamada a session_start(), de lo contrario obtendremos el siguiente aviso:
Warning: session_id(): Session ID cannot be changed when a session is active in <<ruta física del archivo>> on line <<número de línea>>
Siendo <<ruta física del archivo>> la ubicación exacta del archivo que intento generar el ID y <<número de línea>> La línea de código dentro de ese archivo. Esto por cierto, no pasa con las otras dos funciones.
Por ejemplo, crearemos el ID de nuestra sesión con el prefijo “orange-“
$id_sesion = session_create_id("orange-");
Luego lo asignamos:
session_id($id_sesion);
Después de la llamada a session_start(), revisemos como se creo el ID de la sesión:
echo "<p>SESIÓN ID sin prefijo:" . session_id() . "</p>";
echo "<p>SESIÓN ID con prefijo:" . $id_sesion . "</p>";
Quedaría como sigue:

Cuyo resultado ya se puede notar:

Aunque se puede crear simplemente el ID de la sesión con la simple invocación de session_start(), lo que buscamos al hacerlo de este modo es generar un ID con prefijo y luego con ese nuevo valor generar otro ID nuevo. Por último la función session_regenerate_id puede crear un ID de sesión nuevo al reemplazar uno antiguo o crearlo nuevo en caso de no existir. Por ejemplo:
session_regenerate_id();
$id_sesion = session_id();
echo "<p>NUEVO ID de sesión: " . $id_sesion . "</p>";
Mismo que al ejecutar:

NO OBSTANTE, es importante señalar que no es necesario regenerar el ID constantemente y que de hecho cualquiera de los métodos mencionados arriba funciona.
Definiendo variables de sesión en PHP
Para trabajar con las sesiones, PHP utiliza un array global llamado $_SESSION que servirá para almacenar variables, de hecho si le hacemos una salida básica con la función print_r.
print_r($_SESSION);
veremos que se encuentra inicialmente vacío.

Entonces, podemos definir variables de sesión, simplemente introduciéndolas de manera asociativa a nuestro array. Por ejemplo:
$_SESSION["nombre"] = "CableNaranja";
$_SESSION["fecha"] = date("Y-m-d");
Crea dos variables llamadas nombre y fecha dentro de $_SESSION con su correspondiente valor. Entonces, si hacemos print_r nuevamente al array:
print_r($_SESSION);
Podemos observar que $_SESSION ya no se encuentra vacío:

Codificando / Decodificando las variables de sesión
Para codificar los datos de la sesión actual y convertirlos en un String serializado, tenemos la función session_encode() cuyo resultado se debe asignar a una variable, por ejemplo:
$misdatos = session_encode();
Al imprimir esa variable:
echo "<p>Datos serializados : " . $misdatos . "</p>";
Tenemos la siguiente salida:

Por ejemplo, si tomamos la primera variable encontramos:
- nombre : Es el nombre de la variable
- | : Es un separador
- s: es el tipo de datos (s – string, i – integer)
- 12 : Es la longitud de caracteres de la variabe
- “CableNaranja” : Por supuesto es el contenido de la variable
Para recuperar los datos hacia $_SESSION tenemos la función session_decode() misma que recibe como único parámetro una cadena propiamente serializada.
session_decode($misdatos);
Uno de los mayores usos de estas dos funciones, es para recuperar valores sobrescritos por accidente, por ejemplo:
$_SESSION["nombre"] = "CableNaranja";
$_SESSION["fecha"] = date("Y-m-d");
print_r($_SESSION);
$misdatos = session_encode();
echo "<p>Datos serializados : " . $misdatos . "</p>";
$_SESSION["nombre"] = "Cable Naranja Blog";
$_SESSION["fecha"] = date("Y-m-d H:s:i");
echo "<p>Datos nuevos</p>";
print_r($_SESSION);
session_decode($misdatos);
echo "<p>Datos recuperados</p>";
print_r($_SESSION);
Observemos como podemos cambiar las variables dentro de $_SESSION después de la llamada a session_encode() y aún así recuperar sus valores previos al llamar a session_decode().

Revisar el estado de una sesión
Para revisar el estado actual de una sesión, podemos llamar a la función session_status() Esta función devuelve un número entero que representa uno de los siguientes valores:
PHP_SESSION_DISABLED
o simplemente 0, significa que las sesiones están deshabilitadas en tu servidor.PHP_SESSION_NONE
o simplemente 1, significa que las sesiones están activas pero no hay ninguna actualmente.PHP_SESSION_ACTIVE
o simplemente 2, las sesiones están activas y existe al menos una
Por ejemplo:
echo "<p>Estado de la sesión : " . session_status() . "</p>";
Lo que nos dará:

Abortar una sesión en PHP
Para terminar abruptamente una sesión (por la razón que sea) utilizamos la función session_abort() misma que regresa true o false dependiendo si pudo lograr o no la terminación de la sesión. Por ejemplo:
$abort = session_abort();
if($abort) echo "<p>La sesión ha sido terminada.</p>";
Nos dará como resultado:

Finalizar una sesión en PHP
Dado que abortar una sesión no es un método recomendable en la mayoría de los casos. Se debe finalizar correctamente una sesión. Para lograr esto, necesitaremos de tres funciones muy importantes, las cuales se deben llamar en el siguiente orden:
- session_unset() : Elimina todas las variables de $_SESSION, dejándolo nuevamente vacío.
- session_write_close() : Almacena la información de la sesión y la finaliza.
- session_destroy() : Destruye la sesión previamente finalizada
Por ejemplo:
session_unset();
session_write_close();
session_destroy();
echo "<p>La sesion ha finalizado completamente<p>";
Podemos comprobar la destrucción completa de la sesión, por ejemplo al imprimir el estado de la sesión ya que al no existir más, obtendremos el valor de 1 (PHP_SESSION_NONE
)
echo session_status();
Observe la salida:

Un ejemplo sencillo del manejo de sesiones
Vamos a realizar un ejemplo sencillo para que entendamos mejor todo lo que hemos visto. Lo haremos en tres archivos:
- index.php : Contiene un formulario para el inicio de sesión, al usuario se le pedirá que introduzca su nombre completo para comenzar.
- principal.php : Si el usuario escribe su nombre completo, será dirigido a este archivo. Aquí le daremos dos opciones:
- Cambio de nombre : El usuario podrá cambiar su nombre cada vez que lo desee, esto se almacenará en $_SESSION
- Finalizar sesión : Si el usuario elige finalizar se le enviará a un tercer archivo.
- finalizar.php : En este archivo se destruirá la sesión por completo y se le enviará de regreso al archivo index por si quiere hacerlo de nuevo.
El inicio de la sesión en nuestra aplicación
Comencemos con un poco de HTML para mostrarle al usuario el formulario con algo de texto aimgable:
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta lang="es" />
<title>Inicio de sesión</title>
</head>
<body>
<h1>INICIO DE SESIÓN</h1>
<p>Bienvenido, por favor escribe tu nombre para iniciar la sesión:</p>
<form method="POST" action="#">
<p><input type="text" placeholder="Tu nombre completo, por favor" required name="txtNombre" /></p>
<p><input type="submit" name="btnOK" value="INICIAR" /></P>
</form>
</body>
</html>
Mismo que tiene la siguiente apariencia:

Lo siguiente será crear un bloque de código PHP para trabajar, dado que session_start() siempre debe estar al inicio, abrimos dicho bloque en la primera línea de código
<?php
Ahora llamamos a session_start()
session_start();
Creamos una variable llamada mensaje que inicialmente estará vacía.
$mensaje = "";
Si hemos presionado el botón de iniciar y el estado de la sesión es 1 (Es decir, no hay ninguna activa) o 2 (Esto porque puede haber más de una sesión activa)
if(isset($_POST["btnOK"]) && (session_status()==1 || session_status()==2)){
Generamos un ID de sesión nuevo usando session_create_id();
session_create_id();
Guardamos la variable de la caja de texto que viene por el método POST en $_SESSION y le llamamos minombre.
$_SESSION["minombre"] = $_POST["txtNombre"];
Y cerramos el if que hemos abierto.
}
Con un else, nos aseguramos de crear un mensaje apropiado en caso de que la sesión no se haya podido crear.
else $mensaje = "No se pudo iniciar la sesión, intente de nuevo";
Ahora, revisamos si la variable que creamos dentro de $_SESSION se pudo crear, esto lo hacemos con la función isset()
if(isset($_SESSION["minombre"])){
Entonces abrimos un flujo de datos con ob_start()
ob_start();
Con la función header() nos movemos hacia el archivo principal.php
header("Location: principal.php");
Cerramos el flujo de salida.
ob_end_flush();
Cerramos el if que abrimos.
}
Por supuesto, cerramos el bloque PHP
?>
Así es como va el código al momento:

Lo siguiente es mostrar el mensaje de error en caso de que haya sucedido algo y no se haya creado la sesión, esto lo haremos justo al finalizar el formulario. El mensaje solo aparecerá si hemos presionado el botón (función isset) y si la longitud de la variable mensaje es mayor a cero.
<?php
if(isset($_POST["btnOK"]) && strlen($mensaje)>0) echo "<p>$mensaje</p>";
?>
Observemos donde lo hemos puesto:

El archivo principal de nuestra aplicación
En el archivo principal, abrimos un bloque de código PHP para comprobar, si el estado de la sesión es 0 o 1 (menos a 2), regresamos al usuario al archivo index.php. Recordemos que ob_start() inicia el flujo de salida, header() nos dirige la salida y ob_end_flush() termina dicho flujo.
<?php
session_start();
if(session_status<2){
ob_start();
header("Location: index.php");
ob_end_flush();
}
Si el estado de la sesión es 2 (else), es decir que la sesión está activa (porque en el archivo anterior se logró llamar a session_start()) entonces por el momento cerramos el bloque PHP, ya que podemos continuar.
else{
?>
Debajo de ese bloque PHP, coloquemos el HTML mínimo para nuestro archivo.
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta lang="es" />
<title>Sesión en proceso</title>
</head>
<body>
<body>
</html>
Y debajo del HTML, coloquemos un bloque PHP para cerrar la llave del ELSE que tenemos abierta.
<?php
}
?>
Nuestro archivo principal luce por ahora así:

Dentro del <body> Colocamos un <h1> que le de la bienvenida al usuario, por supuesto imprimimos su nombre ya que lo tenemos guardado en la sesión. Esto lo podemos hacer usando el shorthand para echo.
<h1>Bienvenido <?= $_SESSION["minombre"]; ?></h1>
También le mostramos el formulario que puede utilizar para cambiar su nombre y el enlace que lleva a cerrar la sesión.
<p>Puedes cambiar tu nombre:</p>
<form method="POST" action="#">
<p><input type="text" required name="txtNuevo" placeholder="Escribe tu nombre nuevo" />
<p><input type="submit" value="CAMBIAR NOMBRE" name="btnOk" /></p>
</form>
<p>También puedes simplemente <a href="salir.php">Cerrar la sesión</a></p>
Antes del <h1> abrimos un bloque PHP que se asegurará de cambiar el contenido de la variable tipo $_SESSION con el nuevo valor, esto solo ocurrirá si hemos presionado el botón tipo submit del formulario.
<?php
if(isset($_POST["btnOk"])){
$_SESSION["minombre"] = $_POST["txtNuevo"];
}
?>
Nuestro código va quedando así:

Cerrando la sesión de nuestra aplicación
Por supuesto, vamos a crear el archivo salir.php que utilizaremos para cerrar la sesión con session_destroy(), no sin antes vaciar $_SESSION con la función session_unset() y actualizar con session_write_close() Así que abrimos primero el bloque PHP.
<?php
Luego llamamos a session_start()
session_start();
Llamamos a las tres funciones antes mencionadas:
session_unset();
session_write_close();
session_destroy();
Abrimos un flujo de salida.
ob_start();
Redirigimos la salida hacia el archivo index.php
header("Location: index.php");
Cerramos el flujo de salida.
ob_end_fush();
Y por supuesto, cerramos el bloque PHP
?>
Dado que eso es todo lo que necesitamos que haga este archivo, es todo el código que debe llevar.

Probando nuestra aplicación con sesiones
¡Es hora de probar lo que hemos hecho!
DESCARGA EL CÓDIGO FUENTE PARA PROBAR
¿Te ha resultado? Déjanos saber en los comentarios aquí abajo, en nuestra cuenta de twitter @cablenaranja7 o en nuestra página de facebook.

Docente, IT Manager, Blogger & Developer. Escribo por diversión, educo por pasión. | Grandstanding is not my thing.