Кэширование в PHP: Redis, Memcached, APCu и файловое кэширование

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

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

Начать курс

Кэширование в 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
                
    
    

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