Optimización del rendimiento de aplicaciones PHP: guía práctica para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué la velocidad importa?



Imagina que tu sitio web tarda más de 3 segundos en cargar. Según Google, el 53% de los usuarios lo abandonarán y la conversión caerá un 20%. Para un desarrollador PHP, saber optimizar una aplicación no es solo una "buena práctica", sino una necesidad. Incluso si estás comenzando tu camino, las técnicas básicas para acelerar el código te ayudarán a crear proyectos rápidos y receptivos.



En este artículo, analizaremos 4 áreas clave: desde el almacenamiento en caché y el trabajo con bases de datos hasta la configuración del servidor y la creación de perfiles. Obtendrás ejemplos de código listos para usar y una lista de verificación para su implementación.



1. Almacenamiento en caché: guardamos el resultado, no lo recalculamos



El almacenamiento en caché es como escribir una chuleta antes de un examen. En lugar de calcular datos complejos cada vez, los guardamos en un almacenamiento rápido.



1.1. Caché en memoria (Memcached / Redis)

Para datos que cambian con poca frecuencia (por ejemplo, una lista de categorías o configuraciones), el almacenamiento en caché en RAM es ideal.



<?php// Ejemplo con Memcached$memcached = new Memcached();$memcached->addServer('localhost', 11211);

$key = 'categories_list';$categories = $memcached->get($key);

if ($categories === false) { // Los datos no están en caché: los obtenemos de la BD $categories = $db->query("SELECT * FROM categories")->fetchAll(); // Guardamos por 1 hora (3600 segundos) $memcached->set($key, $categories, 3600);}

// Usamos $categoriesforeach ($categories as $cat) { echo $cat['name'];}?>


1.2. Caché de fragmentos HTML (Output Buffer)

Si tienes bloques pesados (widgets, menús), guarda en caché el HTML generado.



<?phpfunction getCachedWidget($widgetName, $ttl = 300) {    $cacheFile = __DIR__ . '/cache/' . md5($widgetName) . '.html';        if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $ttl) {        return file_get_contents($cacheFile);    }        ob_start();    // Aquí el código que genera el widget    echo "<div class='widget'>Contenido complejo...</div>";        $html = ob_get_clean();    file_put_contents($cacheFile, $html);        return $html;}

echo getCachedWidget('sidebar_menu');?>


2. Optimización de consultas a la base de datos



El cuello de botella más común en las aplicaciones PHP es la base de datos. Una sola consulta deficiente puede "matar" el rendimiento de todo el sitio.



2.1. Usa índices

Sin un índice, MySQL se ve obligado a escanear toda la tabla. Agrega índices a los campos que participan en WHERE, JOIN y ORDER BY.



-- Malo: escaneo completoSELECT * FROM users WHERE email = 'test@test.com';

-- Bueno: usamos índiceCREATE INDEX idx_email ON users(email);SELECT * FROM users WHERE email = 'test@test.com';


2.2. Evita las consultas N+1

Este es un error clásico: en un bucle, consultas la BD para cada elemento.



<?php// MALO: N+1 consultas$users = $db->query("SELECT * FROM users")->fetchAll();foreach ($users as $user) {    $orders = $db->query("SELECT * FROM orders WHERE user_id = " . $user['id']);    // ...}

// BUENO: una sola consulta con JOIN$users = $db->query(" SELECT u.*, o.* FROM users u LEFT JOIN orders o ON u.id = o.user_id")->fetchAll();?>


2.3. Carga diferida (Lazy Loading)

No cargues datos que no necesitas en este momento. Usa paginación o LIMIT.



// En lugar de:$all = $db->query("SELECT * FROM logs"); // 100 000 filas

// Usa:$page = $_GET['page'] ?? 1;$limit = 20;$offset = ($page - 1) * $limit;$logs = $db->query("SELECT * FROM logs LIMIT $limit OFFSET $offset");


3. Configuración del servidor y OPcache



A veces el problema no está en el código, sino en la configuración de PHP. La optimización más potente es

Blogs

Book Recommendations