Caché de página en Laravel 13: cómo bajar el TTFB de tu blog por debajo de 200 ms
Un blog Laravel sin caché de página responde en más de 800 ms de TTFB; con la configuración adecuada cae por debajo de 200 ms sin tocar la lógica de negocio. Esta guía te muestra el combo completo: caché de respuestas, Nginx FastCGI, config cache y Octane.
Qué es el TTFB y por qué importa en 2026
El Time To First Byte (TTFB) mide el tiempo entre la petición del navegador y la llegada del primer byte de respuesta del servidor. Es la primera señal que recibe Google sobre la velocidad de tu web: si el servidor tarda, todo lo demás (LCP, INP) empieza con desventaja.
Los umbrales de Google en Core Web Vitals
Core Web Vitals evalúa el TTFB al percentil 75 de los usuarios reales. Hasta 800 ms se considera "good", entre 800 y 1800 ms "needs improvement", y por encima de 1800 ms "poor". El detalle que muchos ignoran: 800 ms es el suelo, no la meta. Para que el LCP quede cómodo en móvil conviene apuntar a menos de 200 ms.
Por qué un blog es el caso perfecto para cachear
Un blog tiene el perfil ideal de contenido cacheable: rutas GET, páginas públicas, pocos cambios y sin estado por usuario. El HTML de un artículo es idéntico para todos los visitantes, así que generarlo de nuevo en cada request es desperdicio puro. Es el escenario donde la caché de página completa rinde más con menos esfuerzo.
Diagnóstico: mide antes de optimizar
Nunca optimices a ciegas. Mide el TTFB real de tus rutas más visitadas y guarda los valores antes de tocar nada.
curl -o /dev/null -s -w "ttfb=%{time_starttransfer}s total=%{time_total}s\n" https://tu-blog.com/articuloEjecuta la petición varias veces y quédate con el p75, no con el mejor caso. Chrome DevTools (pestaña Network) y PageSpeed Insights te dan la misma métrica desde la perspectiva del navegador. Con el dato en la mano sabes si el cuello de botella está en el servidor, en la base de datos o en el arranque de la aplicación.
Caché de página completa con spatie/laravel-responsecache
El paquete de Spatie es la vía más rápida para cachear páginas enteras en Laravel: la primera petición ejecuta el controlador y guarda el HTML, las siguientes se sirven desde caché sin llegar a tocar la lógica.
Instalación y configuración básica
composer require spatie/laravel-responsecache
php artisan vendor:publish --provider="Spatie\ResponseCache\ResponseCacheServiceProvider"Por defecto cachea las respuestas GET con código 200. En la configuración publicada puedes excluir rutas, limitar por URI o definir el TTL. Para un blog, el valor por defecto de 24 horas es un buen punto de partida.
Invalidación al publicar contenido
El punto crítico: cuando publicas o editas un artículo, hay que invalidar la caché para que los visitantes vean el cambio. El paquete incluye helpers y también puedes hacerlo desde tu código de publicación:
use Spatie\ResponseCache\Facades\ResponseCache;
ResponseCache::clear(); // invalida todo el caché de respuestasSi publicas desde un panel admin o con un comando artisan, llama a ResponseCache::clear() justo después de guardar el post. Alternativamente, puedes cachear solo lo que cambia poco y dejar fuera las páginas de portada.
Caché flexible en la v8 del paquete
La versión 8 añadió "flexible caching": reglas por URI y cabeceras que permiten decidir qué se cachea y con qué TTL. Por ejemplo, puedes cachear los artículos con un TTL largo y las páginas de listado con uno corto, o excluir por cabecera las peticiones de bots que no quieras almacenar.
Alternativa en el servidor: Nginx FastCGI cache
Si prefieres no añadir dependencias o quieres una capa extra, Nginx puede cachear la respuesta completa a nivel de servidor. La clave fastcgi_cache guarda el HTML y lo sirve sin ni siquiera arrancar PHP:
fastcgi_cache_path /var/run/nginx-cache levels=1:2 keys_zone=laravel:10m max_size=1g inactive=60m;
location ~ \.php$ {
fastcgi_cache laravel;
fastcgi_cache_valid 200 60m;
fastcgi_cache_bypass $http_authorization;
add_header X-FastCGI-Cache $upstream_cache_status;
}Con el header X-FastCGI-Cache puedes ver en la respuesta si vino de caché (HIT) o se generó (MISS). Es una alternativa sólida cuando no quieres que la caché viva dentro de la aplicación.
El resto del combo: config cache, queries y Octane
La caché de página ataca el mayor costo, pero no es la única pieza. El arranque de Laravel y las consultas pesadas también suman milisegundos.
php artisan optimize (config, route, view, event)
php artisan optimizeEste comando compila la configuración, rutas, vistas y eventos en archivos cacheados. En producción evita que Laravel lea e interprete cada archivo en cada request. Es un cambio de una línea que suele recortar decenas de milisegundos del TTFB.
Cache::remember para consultas pesadas
Las consultas que se repiten en cada visita (menús, artículos relacionados, contadores) merecen caché de fragmento:
use Illuminate\Support\Facades\Cache;
$posts = Cache::remember('ultimos_posts', 3600, function () {
return Post::published()->latest()->take(10)->get();
});Con el store de archivos funciona desde el primer día; si la web escala, cambia a Redis tocando solo config/cache.php.
Laravel Octane: sin arranque por request
Octane (con Swoole, RoadRunner o FrankenPHP) mantiene la aplicación en memoria con workers de larga vida. El bootstrap de Laravel —que ocurre en cada request con PHP-FPM— se ejecuta una sola vez, eliminando el golpe más grande al TTFB después de la caché de página.
php artisan octane:start --server=frankenphp --port=8000Combina Octane con la caché de respuestas y tendrás el escenario ideal: las páginas cacheadas ni siquiera llegan a PHP, y las que se generan lo hacen sin arranque frío.
Resultados esperados y cómo medirlos
Con el combo completo, un blog que respondía en unos 900 ms de TTFB suele bajar al rango de 180-250 ms. Los números exactos dependen del hosting, pero el orden de magnitud se repite en la práctica. Vuelve a ejecutar el mismo curl -w de antes y compara: si el TTFB bajó y el LCP en PageSpeed Insights mejoró, la optimización funcionó.
Conclusión
La caché de página en Laravel 13 es la herramienta más rentable para acelerar un blog: instala responsecache, invalida al publicar, añade Nginx FastCGI si quieres una capa extra y completa con optimize, Cache::remember y Octane. Mide antes y después, y el TTFB por debajo de 200 ms deja de ser un objetivo para convertirse en tu nueva normalidad. Sigue leyendo el blog para más guías de Laravel y rendimiento web.