Prácticas Avanzadas en PHP. Hasta ahora, has aprendido a programar en PHP, gestionar formularios, conectarte a bases de datos, consumir APIs e incluso trabajar con frameworks. Pero para que una aplicación esté verdaderamente lista para entornos reales de producción, es necesario dominar algunas técnicas avanzadas.
En este capítulo veremos tres pilares clave:
1. Gestión de Sesiones y Cookies
Aprenderás a trabajar con sesiones y cookies para mantener información entre diferentes páginas, como por ejemplo mantener la autenticación de un usuario o guardar sus preferencias.
2. Envío de Correos con PHP
Verás cómo enviar correos electrónicos desde una aplicación PHP, aspecto imprescindible en procesos como verificación de usuarios, notificaciones o formularios de contacto.
3. Uso de Composer y Dependencias Externas
Composer es la herramienta de gestión de paquetes y dependencias más utilizada en PHP. Aquí aprenderás cómo usarla para incorporar bibliotecas de terceros en tus proyectos y así ahorrar tiempo y esfuerzo. Vamos!!!
13.1 Gestión de Sesiones y Cookies
¿Qué son las sesiones y las cookies?
En el desarrollo web, HTTP es un protocolo sin estado, lo que significa que cada solicitud que hace el cliente (el navegador) es independiente. Esto presenta un desafío: ¿cómo mantenemos la información entre una página y otra? Aquí es donde entran en juego las sesiones y las cookies.
- Cookies: Son pequeños archivos que el servidor guarda en el navegador del usuario. Son útiles para recordar información en el lado del cliente, como el idioma seleccionado, los productos añadidos al carrito o la autenticación persistente.
- Sesiones: Son mecanismos que permiten almacenar información en el servidor y asignarla a un usuario mediante un identificador único. La sesión es más segura porque los datos no se almacenan en el cliente, solo el ID de sesión.
¿Cuándo usar cada uno?
Uso | ¿Cookies? | ¿Sesiones? |
---|---|---|
Recordar preferencias del usuario (idioma, tema, etc.) | ✅ | ❌ |
Mantener al usuario autenticado en el sistema | ✅ | ✅ |
Almacenar datos sensibles (correo, ID, tokens) | ❌ | ✅ |
Temporales (carrito, formulario a medio rellenar) | ❌ | ✅ |
Trabajando con Cookies en PHP
Crear una cookie
Para utilizar las cookies hacemos uso de la función setcookie, a la que tendremos que indicar el nombre que asignamos a la cookie, el valor que queremos almacenar, el tiempo de validez de esa cookie y desde dónde será visible. Por ejemplo:
<?php
// Crear una cookie que dura 1 hora
setcookie("usuario", "Juan", time() + 3600, "/");
echo "Cookie creada.";
?>
"usuario"
es el nombre de la cookie."Juan"
es su valor.time() + 3600
define el tiempo de expiración (1 hora desde ahora)."/"
indica que está disponible en todo el sitio.
Leer una cookie
Para leer una cookie utilizamos el valor de la variable $_COOKIE[], facilitando el nombre de la cookie almacenada.
<?php
if (isset($_COOKIE["usuario"])) {
echo "Hola, " . $_COOKIE["usuario"];
} else {
echo "Usuario desconocido.";
}
?>
Borrar una cookie
Para borrar una cookie, bastará con asignarle el valor nulo o «».
<?php
// Para eliminarla, se crea con el tiempo expirado
setcookie("usuario", "", time() - 3600, "/");
?>
Y hasta aquí el manejo de cookies, como puedes ver es bastante sencillo.
Trabajando con Sesiones en PHP
Iniciar una sesión
Para trabajar con sesiones, debes iniciar la sesión al principio de cada script que quiera acceder a ella, eso lo hacemos con la función session_start() y luego indicamos el id de la sessión con $_SESSION[]
<?php
session_start(); // Siempre al inicio
$_SESSION["usuario"] = "Juan";
echo "Sesión iniciada.";
?>
Leer datos de sesión
Para leer los datos de la sesión, nuevamente tenemos que arrancar el script con session_start() pues se va a hacer uso dentro del script, y posteriomente comprobar si existe el ide de sessión con isset($_SESSION[«id_sesion»]). Veamoslo con el ejemplo.
<?php
session_start();
if (isset($_SESSION["usuario"])) {
echo "Bienvenido, " . $_SESSION["usuario"];
} else {
echo "No hay usuario conectado.";
}
?>
Destruir una sesión
Para elminar la sessión, invocaremos a la funión session_unset() para borrar los datosy y posteriormente a session_destroy() para eliminar por completo el id de sesión.
<?php
session_start();
// Borra todas las variables de sesión
session_unset();
// Destruye la sesión
session_destroy();
echo "Sesión terminada.";
?>
Ejemplo completo de autenticación con sesión
formulario.php:
<form method="post" action="login.php">
Usuario: <input type="text" name="usuario"><br>
<input type="submit" value="Entrar">
</form>
login.php:
<?php
session_start();
$usuario = $_POST["usuario"];
if (!empty($usuario)) {
$_SESSION["usuario"] = $usuario;
header("Location: panel.php");
} else {
echo "Debes escribir un nombre de usuario.";
}
?>
panel.php:
<?php
session_start();
if (isset($_SESSION["usuario"])) {
echo "Hola, " . $_SESSION["usuario"] . ". Bienvenido al panel.";
echo "<a href='logout.php'>Cerrar sesión</a>";
} else {
echo "Acceso denegado. Inicia sesión primero.";
}
?>
logout.php:
<?php
session_start();
session_destroy();
header("Location: formulario.php");
?>
Seguridad en sesiones y cookies
- Usa siempre
session_start()
antes de cualquier salida en pantalla. - En sitios con datos sensibles, utiliza HTTPS para proteger cookies.
- Utiliza
httponly
ysecure
ensetcookie()
para evitar ataques de JavaScript (XSS). - Regenera el ID de sesión con
session_regenerate_id()
tras el inicio de sesión para evitar secuestros.
13.2 Envío de Correos con PHP
Enviar correos electrónicos desde una aplicación web es una funcionalidad muy habitual: para confirmar registros, enviar notificaciones, restablecer contraseñas o incluso para formularios de contacto.
PHP facilita esta tarea a través de funciones nativas como mail()
y también mediante bibliotecas externas más potentes como PHPMailer.
– Envío de correos con la función mail()
El envío de correos con la función mail es muy sencilla, basta con invocar a la función mail y pasando como parámetros los destinatarios, el asunto, el mensaje y las cabeceras de tipo de contenido.
Sintaxis básica:
mail($para, $asunto, $mensaje, $cabeceras);
- $para: Dirección de destino.
- $asunto: Asunto del correo.
- $mensaje: Contenido del mensaje.
- $cabeceras: Opcional. Se utilizan para definir el remitente, tipo de contenido, etc.
Ejemplo básico:
<?php
$destino = "usuario@ejemplo.com";
$asunto = "Bienvenido a nuestro sitio";
$mensaje = "Gracias por registrarte en nuestro sitio.";
$cabeceras = "From: admin@misitio.com";
if (mail($destino, $asunto, $mensaje, $cabeceras)) {
echo "Correo enviado con éxito.";
} else {
echo "Error al enviar el correo.";
}
?>
@Tip: Esta función depende del servidor. En servidores locales como XAMPP,
mail()
no funciona directamente sin una configuración adicional de un servidor SMTP local como Sendmail o hMailServer.
– Usar PHPMailer para enviar correos vía SMTP
PHPMailer es una de las bibliotecas más populares para enviar correos con PHP. Permite usar SMTP, adjuntar archivos, enviar correos en formato HTML y mucho más.
Instalación de PHPMailer con Composer
composer require phpmailer/phpmailer
Para utilizar PHPMailer tenemos que crearnos un objeto de la clase PHPMailer, al que le asignamos las propiedades del Host, si tiene o no SMPTAuth, usuario, password, etc. Veamoslo con un ejemplo básico de envío con Gmail
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
// Configuración del servidor SMTP
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'tu_email@gmail.com';
$mail->Password = 'tu_contraseña_o_token';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
// Remitente y destinatario
$mail->setFrom('tu_email@gmail.com', 'Tu Nombre');
$mail->addAddress('destino@ejemplo.com', 'Usuario Destino');
// Contenido
$mail->isHTML(true);
$mail->Subject = 'Correo de prueba con PHPMailer';
$mail->Body = '<b>Hola!</b><br>Este es un correo enviado desde PHP usando PHPMailer.';
$mail->AltBody = 'Hola! Este es un correo en texto plano.';
$mail->send();
echo 'Correo enviado correctamente.';
} catch (Exception $e) {
echo "El correo no pudo enviarse. Error: {$mail->ErrorInfo}";
}
?>
@Tip. Nota de seguridad: Si usas Gmail, deberás generar una contraseña de aplicación (no usar tu contraseña real). Además, debes permitir el acceso SMTP en la configuración de seguridad de tu cuenta de Google.
Adjuntar archivos
Con PHPMailer puedes enviar archivos adjuntos fácilmente, para ello, invocaremos al métorod addAttachment del objeto mail que hemos creado indicando la ruta del archivo que queremos enviar y el nombre que le queremos dar.
$mail->addAttachment('/ruta/a/archivo.pdf', 'MiDocumento.pdf');
Comparación mail()
vs PHPMailer
Característica | mail() | PHPMailer |
---|---|---|
Facilidad de uso | ✅ Muy simple | ⚠️ Requiere instalación y más código |
Compatibilidad con HTML | ❌ Requiere más esfuerzo | ✅ Nativa |
Envío mediante SMTP | ❌ No soportado | ✅ Completo soporte |
Archivos adjuntos | ❌ No soportado | ✅ Fácil de usar |
Seguridad y autenticación | ❌ Básica | ✅ Recomendado |
13.3 Uso de Composer y Dependencias Externas
En proyectos PHP modernos, es muy común utilizar bibliotecas de terceros para extender la funcionalidad sin necesidad de «reinventar la rueda». Para gestionar estas bibliotecas, Composer se ha convertido en la herramienta estándar en el ecosistema PHP.
¿Qué es Composer?
Composer es un gestor de dependencias para PHP. Permite declarar las bibliotecas que necesita tu proyecto, y él se encarga de descargarlas, instalarlas y mantenerlas actualizadas. Además, proporciona un cargador automático de clases (autoload
) que simplifica enormemente el uso de bibliotecas externas.
Instalación de Composer
– En Windows
- Ve a https://getcomposer.org/download/
- Descarga el instalador para Windows.
- Sigue el asistente de instalación. Composer se añadirá al PATH del sistema.
– En Linux/Mac (terminal)
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
sudo mv composer.phar /usr/local/bin/composer
Verifica la instalación:
composer --version
Estructura de un proyecto con Composer
Cuando ejecutas composer init
, se crea un archivo llamado composer.json
que define las dependencias del proyecto. Ejemplo:
{
"require": {
"phpmailer/phpmailer": "^6.9",
"guzzlehttp/guzzle": "^7.0"
}
}
Composer descarga esas bibliotecas en una carpeta vendor/
, y genera un archivo autoload.php
que puedes incluir en tu proyecto para acceder fácilmente a las clases de esas bibliotecas.
Comandos más comunes
Comando | Descripción |
---|---|
composer init | Crea un nuevo archivo composer.json interactivo. |
composer require vendor/nombre | Instala una nueva dependencia. |
composer install | Instala todas las dependencias listadas en composer.json . |
composer update | Actualiza las dependencias a sus últimas versiones. |
composer remove vendor/nombre | Elimina una dependencia. |
Ejemplo de uso
Supongamos que queremos usar la biblioteca guzzlehttp/guzzle
(cliente HTTP para consumir APIs):
- Instala la librería:
composer require guzzlehttp/guzzle
- Código PHP usando el autoload de Composer:
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$client = new Client();
$response = $client->get('https://api.chucknorris.io/jokes/random');
$data = json_decode($response->getBody(), true);
echo $data['value'];
Este ejemplo realiza una petición HTTP a una API externa y muestra una broma aleatoria de Chuck Norris.
Ventajas del uso de Composer
- Centraliza la gestión de librerías externas.
- Facilita actualizaciones de código de terceros.
- Simplifica la inclusión de clases con autoloading.
- Compatible con estándares modernos (PSR).
- Imprescindible para trabajar con frameworks como Laravel o Symfony.
¿Y qué es el Autoload?
Composer implementa un autoload automático de clases. Gracias a esto, ya no necesitas usar require
o include
manualmente para cada archivo de clases que importes. Solo tienes que requerir una vez el vendor/autoload.php
y Composer cargará todo por ti.
Repositorio Packagist
Composer utiliza un repositorio llamado https://packagist.org, donde se listan miles de paquetes disponibles para instalar. Puedes buscar allí paquetes útiles según tus necesidades.
Conclusión
Composer es una herramienta fundamental para cualquier desarrollador PHP moderno. Gracias a él puedes incorporar bibliotecas de terceros de forma rápida, segura y mantenible. Junto con el autoloading, mejora la organización del código y la eficiencia en el desarrollo de proyectos.
jercicio 1: Gestión de sesiones de usuario
Enunciado:
Crea un sistema de inicio de sesión básico. Si el usuario introduce correctamente el nombre de usuario y contraseña, debe iniciarse una sesión y mostrar un mensaje de bienvenida. Si no, mostrar un error.
Enunciado:
Crea un sistema de inicio de sesión básico. Si el usuario introduce correctamente el nombre de usuario y contraseña, debe iniciarse una sesión y mostrar un mensaje de bienvenida. Si no, mostrar un error.
Código:
<!-- login.php -->
<?php
session_start();
$usuarioCorrecto = "admin";
$contrasenaCorrecta = "1234";
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$usuario = $_POST["usuario"] ?? '';
$contrasena = $_POST["contrasena"] ?? '';
if ($usuario === $usuarioCorrecto && $contrasena === $contrasenaCorrecta) {
$_SESSION["usuario"] = $usuario;
header("Location: bienvenido.php");
exit;
} else {
$error = "Usuario o contraseña incorrectos.";
}
}
?>
<form method="POST">
Usuario: <input type="text" name="usuario"><br>
Contraseña: <input type="password" name="contrasena"><br>
<input type="submit" value="Iniciar sesión">
</form>
<?php if (!empty($error)) echo "<p style='color:red;'>$error</p>"; ?>
<!-- bienvenido.php -->
<?php
session_start();
if (!isset($_SESSION["usuario"])) {
header("Location: login.php");
exit;
}
?>
<h1>Bienvenido, <?php echo htmlspecialchars($_SESSION["usuario"]); ?>!</h1>
<a href="cerrar.php">Cerrar sesión</a>
<!-- cerrar.php -->
<?php
session_start();
session_destroy();
header("Location: login.php");
exit;
?>
Explicación:
- Se define un usuario y contraseña válidos en el servidor.
- Si las credenciales son correctas, se guarda el usuario en la sesión.
- La página
bienvenido.php
solo se muestra si hay una sesión activa. cerrar.php
destruye la sesión y redirige al login.
Ejercicio 2: Envío de correo usando PHPMailer
Enunciado:
Utiliza PHPMailer para enviar un correo electrónico con asunto, cuerpo en HTML y un archivo adjunto.
Enunciado:
Utiliza PHPMailer para enviar un correo electrónico con asunto, cuerpo en HTML y un archivo adjunto.
Código:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
require 'vendor/autoload.php';
$mail = new PHPMailer(true);
try {
$mail->isSMTP();
$mail->Host = 'smtp.gmail.com';
$mail->SMTPAuth = true;
$mail->Username = 'tucorreo@gmail.com';
$mail->Password = 'tu_contraseña';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->setFrom('tucorreo@gmail.com', 'Tu Nombre');
$mail->addAddress('destinatario@example.com', 'Destinatario');
$mail->addAttachment('documento.pdf'); // Archivo adjunto
$mail->isHTML(true);
$mail->Subject = 'Correo de prueba con PHPMailer';
$mail->Body = '<h1>Hola desde PHPMailer</h1><p>Este es un correo de prueba en HTML.</p>';
$mail->send();
echo 'Correo enviado correctamente.';
} catch (Exception $e) {
echo "El correo no pudo enviarse. Error: {$mail->ErrorInfo}";
}
?>
Explicación:
- Se importa PHPMailer vía Composer (
composer require phpmailer/phpmailer
). - Se configura el envío SMTP con datos de Gmail.
- Se establece el destinatario, el asunto, el cuerpo HTML y se adjunta un archivo.
- Se maneja el error con
try/catch
.
Ejercicio 3: Usar Composer para consumir una API
Enunciado:
Utiliza Composer para instalar GuzzleHTTP y consumir una API pública (por ejemplo, la API de Pokémon https://pokeapi.co/api/v2/pokemon), mostrando el nombre del primer Pokémon.
Enunciado:
Utiliza Composer para instalar GuzzleHTTP y consumir una API pública (por ejemplo, la API de Pokémon https://pokeapi.co/api/v2/pokemon), mostrando el nombre del primer Pokémon.
Código:
# En el Terminal
composer require guzzlehttp/guzzle
<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
$cliente = new Client();
$respuesta = $cliente->request('GET', 'https://pokeapi.co/api/v2/pokemon');
if ($respuesta->getStatusCode() === 200) {
$cuerpo = $respuesta->getBody();
$datos = json_decode($cuerpo, true);
echo "Primer Pokémon: " . $datos['results'][0]['name'];
} else {
echo "Error al consumir la API.";
}
?>
Explicación:
- Se instala Guzzle, una librería cliente HTTP.
- Se hace una petición
GET
a la API de Pokémon. - Se parsea el JSON recibido y se muestra el nombre del primer Pokémon.
- Esto demuestra el poder de Composer para incluir dependencias externas.
Bibliografía de programación en PHP.
- Aprende PHP desde Cero: Todo lo que necesitas para programar en PHP. Autor: Gerardo G. Urtiaga (Editorial: Editorior Independiente)
- PHP y MySQL: Domine el desarrollo de un sitio web dinámico e interactivo. Autor: Olivier Heurtel (Editorial: Ediciones ENI)
- PHP 8: Programación de aplicaciones web en el servidor: Guía paso a paso con ejemplos y proyectos prácticos. Autor: Jose Vicente Cerratlá.