Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сессии и кеш

Сессия хранит данные одного посетителя между запросами: кто вошёл, что лежит в корзине. Кеш хранит результаты медленных вычислений для всех посетителей сразу. У обоих простой интерфейс «записать — прочитать».

Запись и чтение сессии

С сессией работают через объект запроса или функцию 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".

Частая ошибка

Устаревший кеш показывает старые данные: статью удалили, а в блоке «популярное» она ещё висит. Сбрасывайте запись там же, где меняете данные, или задавайте короткий срок хранения. И не кешируйте «на всякий случай»: сначала найдите действительно медленное место.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.