Команды php artisan для кэширования в Laravel
Команды php artisan для управления кэшем в Laravel
Как очистить весь кэш приложения одной командой?
Основное и наиболее эффективное решение для сброса всех видов кэша в Laravel - команда php artisan cache:clear. Она удаляет кэш данных (файловый, Redis, Memcached), а также кэш конфигураций, маршрутов и представлений, если они были предварительно закэшированы отдельными командами. Однако cache:clear не пересоздаёт кэш - он только удаляет. Для перестройки кэша после очистки нужно использовать соответствующие команды.
php artisan cache:clearPhp artisan cache (команда php artisan cache)
Пояснение шагов: Команда вызывает метод Cache::flush() для драйвера кэша по умолчанию (обычно file или redis). Также она вызывает Artisan::call('config:clear'), Artisan::call('route:clear') и Artisan::call('view:clear') внутри себя (в Laravel 9+). Если используется файловый драйвер, удаляются все файлы из storage/framework/cache/data/.
Возможные проблемы и типичные ошибки:
- Ошибка прав доступа:
Unable to write to cache directory. Решение: установить правильные права на папкиstorageиbootstrap/cache(chmod -R 775). - При использовании Redis может возникнуть ошибка подключения, если сервер Redis не запущен. Проверить командой
redis-cli ping. - Команда не очищает кэш сессий, если сессии хранятся в драйвере, отличном от кэша. Для очистки сессий нужна отдельная логика.
Как очистить только кэш данных (без сброса конфигов)?
Для выборочной очистки только кэша данных (ключ-значение) используется флаг --tags или вызов конкретного драйвера. Но стандартная команда cache:clear не имеет таких флагов. Вместо этого можно использовать фасад Cache внутри собственной команды:
php artisan tinker
Cache::flush();Или создать Artisan-команду, которая вызывает Cache::store('file')->flush();.
Проблема: Flush удаляет все ключи, включая тегированные. Если нужно удалить только ключи с определённым тегом, используют Cache::tags(['tag'])->flush(); но это работает не для всех драйверов (не для file).
Как очистить кэш конфигурации?
Для перезагрузки конфигурационных файлов (после изменений в config/) выполняется команда:
php artisan config:clearОна удаляет скомпилированный файл bootstrap/cache/config.php. После этого при следующем запросе конфигурация будет загружаться из исходных файлов. Чтобы снова закэшировать конфиги (для ускорения), используется php artisan config:cache.
Типичная ошибка: Если config:cache выполняется, а затем вручную изменяется .env, изменения не вступят в силу, пока не выполнить config:clear. Это частая причина путаницы.
Как перестроить кэш маршрутов?
Чтобы объединить все маршруты в один файл для ускорения, используется:
php artisan route:cacheОна создаёт bootstrap/cache/routes-v7.php. Однако эту команду нельзя применять, если в маршрутах используются замыкания (Closure), так как они не сериализуются. В таком случае возникает ошибка. Исправить ситуацию можно заменой замыканий на контроллеры или использованием route:clear для удаления кэша.
php artisan route:clear # удалить кэш маршрутовПроблема: После route:cache любые изменения в routes/web.php игнорируются до следующего route:clear и повторного кэширования.
Как очистить кэш представлений (шаблонов Blade)?
Blade-шаблоны кэшируются в скомпилированном виде в storage/framework/views/. Для их очистки:
php artisan view:clearЭто удаляет все скомпилированные файлы .php. При следующем запросе шаблоны будут перекомпилированы. Чтобы предварительно скомпилировать все шаблоны (для production), используется:
php artisan view:cacheТипичная ошибка: Если шаблоны не обновляются после изменений, возможно, включён opcache на сервере, который кэширует скомпилированные PHP-файлы. Решение - перезагрузить PHP-FPM или очистить opcache.
Как очистить кэш событий (events)?
Если вы используете автодискавери событий (Event::listen и т.п.), Laravel может кэшировать карту событий. Очистка:
php artisan event:clearКоманда удаляет файл bootstrap/cache/events.php. Для повторного кэширования: php artisan event:cache.
Работа с кэшем через фасад и тэги
Помимо Artisan-команд, можно управлять кэшем программно. Например, для удаления ключа:
Cache::forget('key');
Cache::pull('key'); // получить и удалитьДля тегированного кэша (только Redis/Memcached):
Cache::tags(['people', 'artists'])->flush();Расширенные примеры использования команд кэша
Пример 1: Проверка состояния кэша перед очисткой
Иногда полезно посмотреть, какие ключи находятся в кэше, особенно при отладке. Сделать это можно через Tinker:
php artisan tinker
> Cache::has('my_key')
=> true
> Cache::get('my_key')
=> "cached_value"Результат: возвращается значение, если ключ существует.
Пример 2: Очистка только файлового кэша определённой папки
Если используется файловый драйвер, можно удалить файлы вручную:
rm -rf storage/framework/cache/data/*Но это не рекомендуется, так как могут остаться частичные данные. Лучше использовать команду cache:clear.
Пример 3: Комбинированная очистка для деплоя
При развёртывании приложения часто выполняют последовательность команд:
php artisan down --retry=60
php artisan optimize:clear # очищает всё (config, route, view, cache, event)
php artisan config:cache
php artisan route:cache
php artisan view:cache
php artisan upРезультат: приложение переводится в режим обслуживания, полностью очищается старый кэш, затем создаётся новый кэш конфигураций, маршрутов и шаблонов, после чего сайт снова запускается.
Пример 4: Работа с Redis через artisan
Если кэш хранится в Redis, можно очищать конкретные базы данных:
php artisan cache:clear --store=redisВ Laravel 10+ можно указать драйвер для очистки. В более старых версиях нужно изменить драйвер в .env или использовать Redis CLI:
redis-cli FLUSHALL
redis-cli FLUSHDBРезультат: удаление всех ключей Redis (осторожно, если Redis используется не только для кэша Laravel).
Пример 5: Создание своей Artisan команды для выборочной очистки тегов
Создайте команду:
php artisan make:command FlushTaggedCache --command=cache:flush-tag<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Cache;
class FlushTaggedCache extends Command
{
protected $signature = 'cache:flush-tag {tag}';
protected $description = 'Clear cache by tag';
public function handle()
{
$tag = $this->argument('tag');
if (Cache::tags([$tag])->flush()) {
$this->info("Cache for tag '{$tag}' cleared.");
} else {
$this->error("Failed to clear cache for tag '{$tag}'.");
}
}
}Затем выполните:
php artisan cache:flush-tag usersРезультат: Cache for tag 'users' cleared.
Пример 6: Использование cache:forget (нестандартная команда)
В Laravel нет встроенной команды cache:forget, но её можно создать аналогично. Либо удалить ключ через Tinker.
php artisan tinker
> Cache::forget('temp_key');
> echo "Key forgotten";Результат: ключ удалён из кэша.