Trabajar con sesiones en PHP es más sencillo de lo que parece. Con apenas tres funciones y la variable superglobal $_SESSION, puedes construir la base de cualquier sistema de autenticación. A continuación se explica paso a paso cómo crear un flujo completo de inicio y cierre de sesión usando código real.
¿Cómo se estructura un sistema básico de sesiones en PHP?
El punto de partida es entender que las sesiones permiten almacenar información del usuario entre diferentes páginas. Para este ejercicio se crean tres archivos dentro de una carpeta llamada sesiones [01:07]:
index.php: simula la página de perfil del usuario.
login.php: contiene la lógica para iniciar sesión.
logout.php: se encarga de destruir la sesión.
En index.php se utiliza un condicional para verificar si el usuario tiene una sesión activa. La forma de saberlo es preguntando si existe un valor dentro de la variable superglobal $_SESSION, específicamente el subíndice id [01:38]. Si $_SESSION['id'] está definido, significa que hay un usuario logueado y se le puede saludar por su nombre. Si no está definido, se muestra un mensaje indicando que no ha iniciado sesión.
php
<?php session_start(); ?>
<?php if (isset($_SESSION['id'])): ?>
<h1>Hola, <?= $_SESSION['username'] ?></h1>
<p>Tu email es: <?= $_SESSION['email'] ?></p>
<?php else: ?>
<h1>No has iniciado sesión :(</h1>
<?php endif; ?>
Los nombres id, username y email no son palabras reservadas de PHP. Son subíndices que el desarrollador define libremente al momento de crear la sesión [04:28].
¿Cómo funciona el login y la función session_start?
En login.php se simula una base de datos con un arreglo de usuarios [03:00]. Cada elemento del arreglo contiene un username y un email. Para elegir con cuál usuario iniciar sesión, se recibe el índice del usuario a través de la URL usando $_GET.
php
<?php
session_start();
$users = [
['username' => 'retaxito', 'email' => 'retaxito@no-es-mi-email.com'],
['username' => 'Mr. Michi', 'email' => 'mrmichi@noesmiemail.com']
];
$user = $_GET['user'] ?? null;
$_SESSION['id'] = $user;
$_SESSION['username'] = $users[$user]['username'];
$_SESSION['email'] = $users[$user]['email'];
El detalle fundamental es la función **`session_start()`** [06:30]. Sin ella, PHP no sabe que se va a trabajar con sesiones y ningún dato se almacena. Esta función debe colocarse **en cada archivo que necesite leer o escribir datos de sesión**, tanto en `login.php` como en `index.php`.
Al acceder a `login.php?user=1`, se asignan los datos del usuario Mr. Michi a la sesión. Después, al regresar a `index.php` y recargar, la página saluda con "Hola, Mr. Michi" y muestra su email [07:45].
### ¿Por qué session_start es obligatorio en cada página?
Cuando se intentó acceder al perfil sin haber declarado `session_start()` en `index.php`, el sistema seguía mostrando que no había sesión iniciada [07:05]. La razón es que **`session_start()` activa el mecanismo de sesiones en PHP** para esa petición en particular. Sin esta llamada, `$_SESSION` simplemente está vacía.
## ¿Cómo cerrar sesión con session_destroy?
El archivo `logout.php` es el más corto de los tres [08:50]. Solo necesita dos líneas:
php
<?php
session_start();
session_destroy();
Primero se llama a `session_start()` porque es necesario tener la sesión activa para poder destruirla. Luego, **`session_destroy()`** elimina todos los datos asociados a esa sesión. Al regresar al perfil y recargar, el mensaje cambia a "No has iniciado sesión".
El flujo completo funciona así:
- Acceder a `login.php?user=0` inicia la sesión con el usuario retaxito.
- Visitar `index.php` muestra el saludo personalizado.
- Acceder a `logout.php` destruye la sesión.
- Volver a `index.php` confirma que ya no hay sesión activa.
### ¿Qué faltaría para un sistema de autenticación real?
En un escenario real se necesita una **base de datos** con usuarios y contraseñas [10:15]. El proceso sería verificar que el usuario y la contraseña enviados desde un formulario coincidan con los registros almacenados. Solo si hay coincidencia (*match*), se procede a definir los valores en `$_SESSION`. Si no coinciden, no se crea ninguna sesión. La lógica de asignación de datos a la sesión es exactamente la misma que se practicó aquí.
¿Ya probaste crear tu propio sistema de sesiones? Comparte cómo te fue o qué variaciones le agregaste.