Кэширование в PHP: Redis, Memcached и встроенные решения от А до Я

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

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

Начать курс

Введение: Почему кэширование — основа производительности PHP

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

В этой статье мы разберем три ключевых подхода к кэшированию в PHP: Redis, Memcached и встроенные решения (APCu, OPcache, файловое кэширование). Вы узнаете, как выбрать правильный инструмент для конкретной задачи, увидите рабочие примеры кода и получите практические рекомендации по внедрению.

1. Встроенные решения PHP: APCu, OPcache и файловое кэширование

1.1. OPcache — кэширование байт-кода

OPcache — это встроенный в PHP механизм, который компилирует и сохраняет скомпилированный байт-код скриптов в памяти. Вместо того чтобы каждый раз парсить и компилировать PHP-файл, OPcache использует готовый результат. Это дает прирост скорости до 30-50% без единой строки кода.

Настройка в php.ini:

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2

Для проверки работы OPcache используйте функцию:

<?php
var_dump(opcache_get_status());
?>

1.2. APCu — кэширование данных в памяти

APCu (Alternative PHP Cache) — это расширение для хранения произвольных данных в общей памяти. Идеально подходит для кэширования результатов тяжелых вычислений, конфигураций или данных, которые редко меняются.

Пример кэширования с APCu:

<?php
// Сохраняем данные в кэш на 3600 секунд (1 час)
$data = ['users' => 1500, 'status' => 'active'];
apcu_store('app_stats', $data, 3600);

// Читаем из кэша
$cached = apcu_fetch('app_stats');
if ($cached === false) {
    // Данных нет в кэше — вычисляем заново
    $cached = computeExpensiveData();
    apcu_store('app_stats', $cached, 3600);
}
?>

1.3. Файловое кэширование — простой старт без дополнительных расширений

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

<?php
class FileCache {
    private $cacheDir;
    
    public function __construct($dir = '/tmp/php_cache/') {
        $this->cacheDir = $dir;
        if (!is_dir($dir)) {
            mkdir($dir, 0777, true);
        }
    }
    
    public function get($key, $ttl = 3600) {
        $file = $this->cacheDir . md5($key) . '.cache';
        if (!file_exists($file)) return null;
        
        if (time() - filemtime($file) > $ttl) {
            unlink($file);
            return null;
        }
        
        return unserialize(file_get_contents($file));
    }
    
    public function set($key, $data) {
        $file = $this->cacheDir . md5($key) . '.cache';
        file_put_contents($file, serialize($data));
    }
}

// Использование
$cache = new FileCache();
$result = $cache->get('expensive_query');
if ($result === null) {
    $result = $db->query('SELECT ...');
    $cache->set('expensive_query', $result);
}
?>

2. Memcached — распределенное кэширование для высоких нагрузок

2.1. Что такое Memcached и когда его использовать

Memcached — это распределенная система кэширования в оперативной памяти. Она работает по принципу key-value и идеально подходит для кэширования результатов SQL-запросов, сессий пользователей и HTML-фрагментов. Основные преимущества:

  • Простота установки и настройки
  • Высокая скорость работы (микросекунды)
  • Поддержка кластеризации для горизонтального масштабирования
  • Автоматическое удаление устаревших данных (LRU-алгоритм)

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

Установка через пакетный менеджер:

# Установка сервера Memcached
sudo apt-get install memcached

# Установка PHP-расширения
sudo pecl install memcached

2.3. Примеры работы с Memcached в PHP

<?php
// Подключение к серверу
$memcached = new Memcached();
$memcached->addServer('localhost', 11211);

// Проверка соединения
if ($memcached->getVersion() === false) {
    die('Memcached не доступен');
}

// Кэширование сложного запроса
function getPopularArticles($memcached, $db) {
    $key = 'popular_articles';
    $articles = $memcached->get($key);
    
    if ($memcached->getResultCode() == Memcached::RES_NOTFOUND) {
        // Данных нет — выполняем запрос к БД
        $articles = $db->query("SELECT * FROM articles WHERE views > 1000 ORDER BY views DESC LIMIT 10")->fetchAll();
        
        // Сохраняем в кэш на 300 секунд
        $memcached->set($key, $articles, 300);
    }
    
    return $articles;
}

// Кэширование сессий
ini_set('session.save_handler', 'memcached');
ini_set('session.save_path', 'localhost:11211');
?>

3. Redis — продвинутое кэширование с богатыми структурами данных

3.1. Почему Redis лучше Memcached для сложных задач

Redis — это не просто кэш, а полноценная база данных в памяти. В отличие от Memcached, Redis поддерживает сложные структуры данных (списки, множества, хэши, сортированные множества), транзакции, pub/sub и персистентность. Идеальный выбор для:

  • Кэширования с автоматическим истечением (TTL)
  • Очередей задач (через списки)

Блоги

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