Saltar al contenido
Portada » Lenguajes » 13. Prácticas Avanzadas en PHP

13. Prácticas Avanzadas en PHP

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 y secure en setcookie() 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.";
}
?>

– 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}";
}
?>

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ísticamail()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

  1. Ve a https://getcomposer.org/download/
  2. Descarga el instalador para Windows.
  3. 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

ComandoDescripción
composer initCrea un nuevo archivo composer.json interactivo.
composer require vendor/nombreInstala una nueva dependencia.
composer installInstala todas las dependencias listadas en composer.json.
composer updateActualiza las dependencias a sus últimas versiones.
composer remove vendor/nombreElimina una dependencia.

Ejemplo de uso

Supongamos que queremos usar la biblioteca guzzlehttp/guzzle (cliente HTTP para consumir APIs):

  1. Instala la librería:
composer require guzzlehttp/guzzle
  1. 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.

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.

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.

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.

LOGO PHP ntroducción a Frameworks PHP.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *