Кэширование в PHP: Redis и другие инструменты
Кэширование — один из ключевых механизмов оптимизации производительности веб-приложений на PHP. Правильно настроенное кэширование позволяет сократить время ответа сервера в 10–50 раз, снизить нагрузку на базу данных и уменьшить потребление ресурсов. В этой статье мы разберём четыре основных подхода к кэшированию в PHP: Redis, Memcached, APCu и классическое файловое кэширование.
Зачем нужно кэширование в PHP?
Без кэширования каждый PHP-запрос может выполнять десятки SQL-запросов, обрабатывать шаблоны и загружать внешние данные. Кэширование сохраняет результат дорогостоящей операции (например, выборки из БД или парсинга XML) и отдаёт его напрямую, минуя повторные вычисления. Основные сценарии применения:
- Кэширование результатов SQL-запросов — сохраняем результат SELECT-запроса на 5–60 секунд.
- Кэширование HTML-фрагментов — готовые блоки меню, виджеты, хлебные крошки.
- Кэширование сессий — хранение сессионных данных в Redis вместо файлов.
- Кэширование данных API — ответы внешних сервисов (погода, курсы валют).
- Кэширование опкода — ускорение выполнения самого PHP-кода (OPcache).
1. Redis — король in-memory кэширования
Redis — это высокопроизводительное in-memory хранилище данных типа «ключ-значение» с поддержкой сложных структур (списки, хеши, множества). Для PHP существует несколько клиентов: predis/predis (чистый PHP) и ext-redis (C-расширение).
Пример установки через Composer:
composer require predis/predis
Базовый пример кэширования с Redis:
<?php
require 'vendor/autoload.php';
use Predis\Client;
$redis = new Client([
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
]);
$cacheKey = 'user_list_page_1';
$ttl = 300; // 5 минут
// Пытаемся получить данные из кэша
if ($redis->exists($cacheKey)) {
$data = unserialize($redis->get($cacheKey));
echo "Данные из кэша";
} else {
// Дорогостоящая операция (например, SQL-запрос)
$data = getUsersFromDatabase(1, 20);
$redis->setex($cacheKey, $ttl, serialize($data));
echo "Данные из БД";
}
print_r($data);
Преимущества Redis: скорость (миллисекунды), поддержка TTL, атомарные операции, Pub/Sub, персистентность на диск. Недостатки: требуется отдельный сервер, расход оперативной памяти.
2. Memcached — простота и скорость
Memcached — ещё одно популярное in-memory хранилище, но без сложных структур данных. В PHP используется расширение memcached (обратите внимание на букву d — это более новая версия).
Установка расширения:
sudo apt install php-memcached
Пример работы с Memcached:
<?php
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);
$key = 'article_42';
$data = $memcached->get($key);
if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) {
$data = fetchArticleFromDB(42);
$memcached->set($key, $data, 3600); // 1 час
echo "Запрос к БД";
} else {
echo "Из кэша Memcached";
}
Когда выбирать Memcached: если нужно простое кэширование строк без сложных структур, и вы не хотите настраивать персистентность. Memcached быстрее Redis в простых операциях get/set, но уступает в функциональности.
3. APCu — кэширование прямо в PHP
APCu (Alternative PHP Cache) — это расширение для кэширования данных в общей памяти текущего PHP-процесса. Не требует отдельного сервера, работает «из коробки».
Установка:
sudo apt install php-apcuТакже в библиотеке
Рекомендаций