Curso de Laravel
Limpiar la caché de Laravel: qué comando usar y cuándo
Por Víctor Peña · Publicado el
Hola, ¿cómo están? Esta lección es corta, pero probablemente sea la que más veces vas a volver a consultar.
Cambias algo en el .env y no pasa nada. Añades una ruta y da 404. Editas una vista y sigue viéndose la anterior. En casi todos esos casos, la respuesta es la misma: está en caché.
Vamos a ver qué guarda cada caché, qué comando la limpia y cuándo usar cada uno.
¡Empecemos!
Los comandos, de un vistazo
php artisan config:clear # configuración y .env
php artisan route:clear # rutas
php artisan view:clear # vistas Blade compiladas
php artisan cache:clear # datos de la aplicación
php artisan event:clear # eventos y listeners
php artisan optimize:clear # todo lo anterior de una vez
Si tienes prisa, optimize:clear resuelve el 90% de los casos. Pero conviene entender qué hace cada uno, porque en producción no siempre quieres borrarlo todo.
config:clear — el que más falta hace
Guarda: todos los archivos de config/ combinados en uno solo, con los valores del .env ya resueltos.
Cuándo limpiarla: cada vez que cambies el .env o cualquier archivo de config/.
php artisan config:clear
Este es el responsable de la mayoría de confusiones. Cambias MAIL_MAILER, DB_DATABASE o APP_LOCALE, recargas, y el sistema sigue usando el valor anterior. No hay ningún error; simplemente ignora el cambio.
Y hay una consecuencia que conviene conocer: cuando la configuración está en caché, la función env() deja de funcionar fuera de config/.
// MAL: en un controlador, devuelve null si la config está cacheada
$clave = env('SERVICIO_API_KEY');
// BIEN
$clave = config('servicios.api_key');
// config/servicios.php
return [
'api_key' => env('SERVICIO_API_KEY'),
];
La regla: env() solo dentro de config/. En el resto del código, siempre config(). Es de esos fallos que funcionan perfectamente en local y explotan en producción, porque en producción sí se cachea la configuración.
route:clear
Guarda: todas las rutas del proyecto en un archivo optimizado.
Cuándo limpiarla: al añadir, cambiar o eliminar rutas, si las tenías cacheadas.
php artisan route:clear
Síntoma típico: creas una ruta nueva y da 404, o route('pacientes.papelera') lanza un error de ruta no definida aunque esté ahí.
Para ver las rutas activas:
php artisan route:list
php artisan route:list --path=pacientes
php artisan route:list --except-vendor
La caché de rutas no admite closures. Si tienes rutas con función anónima, route:cache falla:
// no se puede cachear
Route::get('/prueba', function () {
return 'hola';
});
// sí se puede
Route::get('/prueba', [PruebaController::class, 'index']);
Es una razón más para usar controladores, como vimos en la lección de rutas.
view:clear
Guarda: las plantillas Blade compiladas a PHP, en storage/framework/views/.
Cuándo limpiarla: casi nunca, porque Blade recompila sola cuando detecta que el archivo cambió.
php artisan view:clear
Sirve cuando algo se descuadra: cambias una vista y sigue apareciendo la anterior, o después de copiar archivos entre máquinas con fechas raras.
Y también libera espacio, porque esa carpeta crece bastante con el tiempo.
cache:clear
Guarda: lo que tú guardes desde el código.
Cache::put('total_pacientes', $total, now()->addHour());
Cache::get('total_pacientes');
$reporte = Cache::remember('reporte_mensual', 3600, function () {
return Cita::selectRaw('estado, count(*) as total')
->groupBy('estado')
->get();
});
Ese remember() es el patrón más útil: si el valor está en caché lo devuelve; si no, ejecuta la consulta, la guarda y la devuelve.
php artisan cache:clear
Cuidado en producción. Ese comando borra toda la caché de la aplicación, y si el sistema depende de ella para consultas pesadas, la siguiente carga las recalcula todas de golpe.
Para borrar solo una clave:
Cache::forget('reporte_mensual');
Y para agrupar y borrar por conjuntos —según el controlador de caché que uses:
Cache::tags(['reportes'])->flush();
Un detalle importante: cache:clear también borra las sesiones si SESSION_DRIVER apunta al mismo almacén. Todos los usuarios quedarían desconectados. Vale la pena revisarlo antes de ejecutarlo en un sistema con gente trabajando.
Las cachés que también existen
php artisan event:clear # eventos y listeners descubiertos
php artisan queue:restart # reiniciar los procesos de cola
php artisan schedule:clear-cache
Ese queue:restart es fácil de olvidar y muy desconcertante: los procesos de cola cargan el código una vez y lo mantienen en memoria. Si despliegas cambios y no los reinicias, siguen ejecutando la versión anterior indefinidamente.
Lo veremos con más detalle en la lección de colas, pero conviene tenerlo presente desde ya.
optimize:clear
php artisan optimize:clear
Ejecuta todos los clear de una vez. Es lo que uso en desarrollo cuando algo no cuadra y no quiero pensar cuál es.
El otro lado: cachear en producción
En desarrollo limpias. En producción haces lo contrario:
php artisan optimize
Eso cachea la configuración y las rutas, y mejora de forma notoria el tiempo de respuesta, porque Laravel deja de leer y combinar decenas de archivos en cada petición.
Los comandos por separado:
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan event:cache
En desarrollo, no caches nada. Si ejecutas config:cache en local, vas a pasar la tarde preguntándote por qué el .env no hace efecto.
La secuencia al desplegar
Esta es la parte práctica de la lección. Al subir cambios al servidor:
php artisan down # modo mantenimiento
git pull origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan optimize:clear # limpiar lo viejo
php artisan optimize # cachear lo nuevo
php artisan queue:restart # recargar los trabajadores
php artisan up # volver a levantar
El orden importa: primero limpiar, después cachear. Al revés, cacheas y luego borras lo que acabas de cachear.
Y ese --force en migrate es obligatorio en producción; sin él, Artisan pide confirmación interactiva y el despliegue automatizado se queda esperando.
Lo desarrollamos completo en la lección de despliegue.
Guía rápida de síntomas
| Lo que ves | Lo que suele ser |
|---|---|
El .env no hace efecto |
config:clear |
| Ruta nueva da 404 | route:clear |
route() dice que no existe |
route:clear |
| La vista muestra lo anterior | view:clear |
env() devuelve null |
Config cacheada: usa config() |
| Los datos siguen desactualizados | cache:clear |
| El trabajador de cola usa código viejo | queue:restart |
| El correo va al servidor anterior | config:clear |
| Nada tiene sentido | optimize:clear |
Cuando limpiar no basta
A veces el problema no es la caché de Laravel:
composer dump-autoload
Si creaste una clase nueva y PHP dice que no existe, es el autocargador. Pasa sobre todo al mover archivos entre carpetas.
Y en servidores con OPcache activado, el código PHP compilado también se guarda en memoria. Ahí hace falta reiniciar PHP-FPM:
sudo systemctl reload php8.4-fpm
Si limpiaste todas las cachés de Laravel y el código antiguo sigue ejecutándose, casi siempre es OPcache.
Una advertencia sobre permisos
Si un comando de caché falla con un error de permisos, es que las carpetas de escritura no son accesibles para el servidor web:
chmod -R 775 storage bootstrap/cache
chown -R www-data:www-data storage bootstrap/cache
Esas dos carpetas son las únicas que Laravel necesita escribir.
Errores comunes
env()fuera deconfig/, que devuelvenullen producción.config:cacheen desarrollo, y horas perdidas con el.env.- Desplegar sin
queue:restart, dejando los trabajadores con código viejo. cache:clearen producción sin pensar en las sesiones.- Cachear después de limpiar en lugar de al revés.
- Buscar el problema en Laravel cuando es OPcache o el autocargador.
Para cerrar
Si te quedas con tres cosas de esta lección:
optimize:clear cuando algo no cuadra en desarrollo. optimize al desplegar en producción. Y config() en lugar de env() fuera de la carpeta de configuración.
Ese último punto no es una preferencia de estilo: es la diferencia entre un sistema que funciona en producción y uno que falla sin explicación aparente.
Con esta lección cerramos el módulo. En la siguiente empezamos con Laravel avanzado, viendo el contenedor de servicios y la inyección de dependencias.
Saludos y éxitos.
Norvic Software
Desarrollamos el software que tu empresa necesita
Somos una fábrica de software en Bolivia. Construimos sistemas a medida y aplicaciones móviles, y llevamos Inteligencia Artificial a las empresas que ya tienen un sistema funcionando.
- Chatbots con Inteligencia Artificial
- Creación de agentes de IA
- Integración de IA en tus sistemas
- Desarrollo de software a medida
- Aplicaciones móviles iOS y Android
- Consultoría y asesoramiento técnico
Cotización sin costo · Respuesta directa por WhatsApp