Кеширование
Кеш — временное хранилище готовых результатов. Если список популярных статей считается тяжёлым запросом, его можно посчитать один раз, сохранить на несколько минут и всё это время отдавать готовым. Страница открывается быстрее, а база данных отдыхает. С кешем работают через функцию 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(), а не страницу целиком.