Сессии и кеш
Сессия хранит данные одного посетителя между запросами: кто вошёл, что лежит в корзине. Кеш хранит результаты медленных вычислений для всех посетителей сразу. У обоих простой интерфейс «записать — прочитать».
Запись и чтение сессии
С сессией работают через объект запроса или функцию session():
$request->session()->put('cart', [1, 5, 9]);
$cart = $request->session()->get('cart', []);
session(['locale' => 'ru']);
$locale = session('locale', 'en');Второй аргумент get() — значение по умолчанию.
Изменение и удаление
$request->session()->push('cart', 12); // добавить в массив
$request->session()->increment('visits'); // увеличить счётчик
$request->session()->forget('cart'); // удалить ключ
$request->session()->flush(); // очистить сессиюРазовые сообщения
flash() сохраняет значение только до следующего запроса — так показывают сообщение после перенаправления:
$request->session()->flash('status', 'Профиль обновлён');
return redirect('/profile')->with('status', 'Профиль обновлён');@if (session('status'))
<div class="alert">{{ session('status') }}</div>
@endifГде хранятся сессии
Место хранения задаёт переменная SESSION_DRIVER в .env:
| Драйвер | Где лежат данные |
|---|---|
database | Таблица в базе данных; вариант по умолчанию |
file | Файлы в storage/framework/sessions |
redis | Сервер Redis — быстро, для нагруженных сайтов |
cookie | Зашифрованные куки в браузере |
Кеш
Результат медленного запроса сохраняют в кеше и отдают оттуда, пока не истечёт срок:
use Illuminate\Support\Facades\Cache;
Cache::put('settings', $settings, now()->addHour());
$settings = Cache::get('settings', []);remember
Чаще всего нужен метод remember(): он возвращает значение из кеша, а если его там нет — выполняет функцию, сохраняет результат и возвращает его:
$popular = Cache::remember('posts.popular', now()->addMinutes(10), function () {
return Post::orderByDesc('views')->take(5)->get();
});Десять минут запрос к базе не выполняется вообще.
Сброс кеша
Когда данные изменились, запись удаляют — следующее обращение создаст её заново:
Cache::forget('posts.popular');Всё хранилище очищает команда:
php artisan cache:clearЧто кешировать
Хорошие кандидаты — данные, которые читают часто, а меняют редко: настройки сайта, меню, списки «популярное», ответы чужих API. Данные конкретного пользователя кешируют с его идентификатором в ключе: "user.{$id}.stats".
Частая ошибка
Устаревший кеш показывает старые данные: статью удалили, а в блоке «популярное» она ещё висит. Сбрасывайте запись там же, где меняете данные, или задавайте короткий срок хранения. И не кешируйте «на всякий случай»: сначала найдите действительно медленное место.