Encodera

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

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

Оглавление

Кеширование

Кеш — временное хранилище готовых результатов. Если список популярных статей считается тяжёлым запросом, его можно посчитать один раз, сохранить на несколько минут и всё это время отдавать готовым. Страница открывается быстрее, а база данных отдыхает. С кешем работают через функцию cache(); по умолчанию данные лежат в файлах папки writable/cache.

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

// app/Controllers/Home.php
public function index(): string
{
    $time = cache()->get('saved_time');
 
    if ($time === null) {
        $time = date('H:i:s');
        cache()->save('saved_time', $time, 60);
    }
 
    return "Время в кеше: $time";
}

Откройте главную страницу и обновите её несколько раз: время не меняется, потому что берётся из кеша. Через 60 секунд значение устареет, get() вернёт null, и в кеш запишется новое время. Третий аргумент save() — срок хранения в секундах.

Метод remember

Проверку «есть ли значение» и запись объединяет метод remember():

// app/Controllers/Posts.php
public function popular(): string
{
    $posts = cache()->remember('popular_posts', 600, static function () {
        return model(PostModel::class)
            ->where('status', 1)
            ->orderBy('id', 'DESC')
            ->findAll(5);
    });
 
    return view('posts/index', ['posts' => $posts]);
}

Если значение есть в кеше, оно возвращается сразу. Если нет — выполняется функция, а её результат сохраняется на десять минут. Запрос к базе выполняется раз в десять минут, а не при каждом открытии страницы.

Сброс кеша

Когда данные меняются, устаревшее значение удаляют — обычно сразу после сохранения записи:

model(PostModel::class)->insert($data);
 
cache()->delete('popular_posts');

Следующий посетитель получит свежий список. Весь кеш целиком очищает команда php spark cache:clear.

Методы кеша

ВызовЧто делает
cache()->save('key', $value, 300)Сохраняет значение на 300 секунд
cache()->get('key')Возвращает значение или null
cache('key')Короткая запись чтения
cache()->remember('key', 300, $callback)Читает или вычисляет и сохраняет
cache()->delete('key')Удаляет значение
cache()->clean()Удаляет всё

В ключах используйте буквы, цифры и подчёркивание: фигурные и круглые скобки, косая черта, двоеточие и знак @ запрещены.

Кеш целой страницы

Страницу, одинаковую для всех посетителей, можно сохранить целиком:

public function about(): string
{
    $this->cachePage(3600);
 
    return view('pages/about');
}

В течение часа CodeIgniter отдаёт готовый HTML и не вызывает контроллер вовсе.

Настройки

Хранилище выбирают в app/Config/Cache.php свойством $handler. Значение file подходит для одного сервера; redis и memcached быстрее и нужны, когда серверов несколько.

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

Кешировать целиком нельзя страницы, которые зависят от посетителя: с именем пользователя, корзиной, формой с токеном CSRF. Первый открывший страницу попадёт в кеш, и все остальные увидят его данные. Для таких страниц кешируйте только общие данные через remember(), а не страницу целиком.

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

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