Команды php artisan для кэширования в Laravel

Раздел: Laravel -> Кэширование в Laravel

Команды php artisan для управления кэшем в Laravel

Как очистить весь кэш приложения одной командой?

Основное и наиболее эффективное решение для сброса всех видов кэша в Laravel - команда php artisan cache:clear. Она удаляет кэш данных (файловый, Redis, Memcached), а также кэш конфигураций, маршрутов и представлений, если они были предварительно закэшированы отдельными командами. Однако cache:clear не пересоздаёт кэш - он только удаляет. Для перестройки кэша после очистки нужно использовать соответствующие команды.

php artisan cache:clear

Php 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";

Результат: ключ удалён из кэша.

Команда php artisan cache - comments

En
Php artisan cache (php)