Кэширование в PHP: Redis, Memcached и APCu — полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Кэширование в PHP: Redis, Memcached и другие инструменты

Кэширование — один из самых эффективных способов ускорить работу веб-приложений на PHP. Вместо того чтобы каждый раз выполнять тяжелые запросы к базе данных или вычислять сложные данные, вы сохраняете результат в быстром хранилище. В этой статье мы разберем основные инструменты кэширования в PHP: Redis, Memcached, APCu и простое файловое кэширование. Вы узнаете, когда какой инструмент выбрать и как правильно его использовать.

Зачем нужно кэширование?

Представьте, что ваш сайт показывает список последних новостей. Без кэширования каждый пользователь заставляет PHP выполнять SQL-запрос, обрабатывать данные и формировать HTML. Если к сайту обращаются 1000 человек в минуту, база данных испытывает огромную нагрузку. Кэш позволяет сохранить результат на 5–10 минут и отдавать его мгновенно.

Основные сценарии использования кэша в PHP:

  • Результаты тяжелых SQL-запросов
  • HTML-фрагменты страниц
  • Данные API-запросов к внешним сервисам
  • Сессии пользователей
  • Конфигурации и настройки

1. Redis — король кэширования

Redis — это in-memory хранилище данных, работающее по принципу «ключ-значение». Он поддерживает сложные структуры данных: списки, множества, хеш-таблицы. Для PHP существует популярное расширение phpredis и более современная библиотека Predis.

Установка и подключение

Установите Redis на сервер, затем установите расширение через Composer:

composer require predis/predis

Пример работы с Redis в PHP

<?php
require 'vendor/autoload.php';

use Predis\Client;

$client = new Client([
    'scheme' => 'tcp',
    'host'   => '127.0.0.1',
    'port'   => 6379,
]);

// Сохраняем данные на 10 минут
$client->setex('news_list', 600, json_encode($newsData));

// Получаем данные
$cached = $client->get('news_list');
if ($cached) {
    $newsData = json_decode($cached, true);
} else {
    // Запрос к БД и сохранение в кэш
}
?>

Преимущества Redis: высокая скорость (микросекунды), автоматическое удаление устаревших ключей (TTL), поддержка Pub/Sub, транзакции. Недостаток — потребляет оперативную память.

2. Memcached — простота и скорость

Memcached — это еще одно in-memory хранилище, но проще, чем Redis. Он хранит только строки и не поддерживает сложные структуры данных. Однако для базового кэширования он идеален.

Пример с Memcached

<?php
$memcached = new Memcached();
$memcached->addServer('127.0.0.1', 11211);

$key = 'user_profile_123';
$data = $memcached->get($key);

if ($data === false) {
    // Данных нет в кэше — получаем из БД
    $data = getUserProfileFromDB(123);
    $memcached->set($key, $data, 300); // 5 минут
}
?>

Memcached быстрее Redis в простых операциях get/set, но уступает в функциональности. Подходит для кэширования результатов запросов и сессий.

3. APCu — кэш на уровне PHP

APCu (Alternative PHP Cache) — это расширение, которое хранит данные прямо в памяти PHP-процесса. Он не требует отдельного сервера, но работает только в рамках одного сервера.

Пример с APCu

<?php
// Сохраняем значение на 10 минут
apcu_store('site_config', $config, 600);

// Получаем значение
$config = apcu_fetch('site_config');
if ($config === false) {
    // Загружаем конфиг из файла
    $config = parse_ini_file('config.ini');
    apcu_store('site_config', $config, 600);
}
?>

APCu идеален для кэширования конфигураций, шаблонов и небольших данных, которые редко меняются. Минус — данные теряются при перезапуске PHP или веб-сервера.

4. Файловое кэширование — просто и надежно

Если у вас нет возможности установить Redis или Memcached, можно использовать файловую систему. Это медленнее, но работает на любом х

Рекомендаций