Кэширование в PHP: как ускорить сайт и снизить нагрузку на сервер

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

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

Начать курс

Кэширование данных в PHP: первая помощь для вашего сервера

Представьте: вы заходите на любимый сайт, а он грузится целую вечность. Знакомо? Чаще всего причина не в слабом хостинге и не в «тяжелом» дизайне, а в том, что сервер каждый раз выполняет одну и ту же работу. Он снова обращается к базе данных, заново собирает HTML-код, пересчитывает статистику.

Решение этой проблемы — кэширование в PHP. Это как приготовить обед на неделю вперед: один раз потратил время, а потом просто разогреваешь. В мире веб-разработки это называется «кэширование данных». Грамотно настроенный PHP кэш может ускорить сайт в 10–50 раз и снизить нагрузку на сервер до минимума.

В этой статье мы разберем, какие виды кэширования существуют, как их реализовать с помощью PHP и когда какой инструмент выбрать. Поехали!

Почему кэширование — это must have для любого PHP-проекта?

Любой динамический сайт на PHP работает по схеме: запрос → обработка → ответ. Самая дорогая операция — это работа с базой данных (MySQL, PostgreSQL) и генерация сложных HTML-страниц. Если у вас 1000 посетителей в час, а каждый запрос делает 10 SQL-запросов, сервер быстро «ляжет».

Кэш в PHP решает три главные задачи:

  • Скорость — данные отдаются из памяти или из файла за миллисекунды;
  • Экономия ресурсов — процессор и база данных отдыхают;
  • Масштабирование — сайт выдерживает рост трафика без апгрейда железа.

При этом неважно, пишете ли вы на чистом PHP или используете фреймворк (Laravel, Symfony, Yii2) — принципы кэширования данных везде одинаковы.

Основные виды кэширования в PHP

Прежде чем писать код, давайте разберемся, что именно мы можем кэшировать. Выделяют три основных уровня:

1. Кэш страниц (Page Cache)

Самый простой и эффективный вид. Готовый HTML-код страницы сохраняется в файл или в память. При повторном запросе сервер отдает готовый HTML, минуя интерпретатор PHP и базу данных. Идеально для статичных страниц (главная, блог, каталог).

2. Кэш данных и объектов (Data/Object Cache)

Сохраняются результаты тяжелых вычислений, выборок из БД, API-ответы. Например, список последних статей, курс валют, рейтинг пользователей. Это то, что принято называть кэшированием данных.

3. Кэш кода (Opcode Cache)

PHP-скрипты компилируются в байт-код. Такие инструменты, как OPcache, сохраняют этот байт-код в памяти, чтобы не компилировать один и тот же скрипт при каждом запросе. Включается на уровне сервера и не требует написания кода.

В этой статье мы сфокусируемся на первых двух типах, так как их можно контролировать через код на PHP.

Реализация кэширования в PHP: от простого к сложному

Файловый кэш своими руками

Самый простой способ кэширования в PHP — сохранять данные в файлы. Это не требует установки дополнительных расширений и работает на любом хостинге.

Вот пример простого класса для файлового кэша:

<?php
class FileCache
{
    private $cacheDir;

    public function __construct($cacheDir = '/tmp/php-cache/')
    {
        $this->cacheDir = $cacheDir;
        if (!is_dir($this->cacheDir)) {
            mkdir($this->cacheDir, 0755, true);
        }
    }

    public function set($key, $data, $ttl = 3600)
    {
        $file = $this->getFilePath($key);
        $content = [
            'expires' => time() + $ttl,
            'data' => $data
        ];
        file_put_contents($file, serialize($content));
    }

    public function get($key)
    {
        $file = $this->getFilePath($key);
        if (!file_exists($file)) {
            return null;
        }
        $content = unserialize(file_get_contents($file));
        if ($content['expires'] < time()) {
            unlink($file);
            return null;
        }
        return $content['data'];
    }

    private function getFilePath($key)
    {
        return $this->cacheDir . md5($key) . '.cache';
    }
}

// Использование
$cache = new FileCache();
$articles = $cache->get('latest_articles');
if ($articles === null) {
    // Допустим, тяжелый SQL-запрос
    $articles = getArticlesFromDB(); 
    $cache->set('latest_articles', $articles, 300); // кэш на 5 минут
}
foreach ($articles as $article) {
    echo $article['title'];
}
?>

Этот подход хорош для небольших проектов. Минус — медленная работа на больших объемах данных, так как каждый раз происходит чтение/запись на диск.

Кэширование через Memcached

Memcached — это система кэширования в оперативной памяти. Данные хранятся в RAM, поэтому скорость доступа в разы выше, чем у файлового кэша. Для работы нужно установить расширение php-memcached.

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

// Пытаемся получить данные из кэша
$key = 'user_profile_42';
$profile = $memcached->get($key);

if ($memcached->getResultCode() === Memcached::RES_NOTFOUND) {
    // Данных нет в кэше — загружаем из БД
    $profile = getUserProfileFromDB(42);
    $memcached->set($key, $profile, 600); // храним 10 минут
}

echo $profile['name'];
?>

Memcached идеален для кэширования данных, которые часто читаются, но редко обновляются: сессии пользователей, настройки, результаты агрегации.

Redis: продвинутое кэширование в PHP

Redis — это не просто кэш, а полноценное хранилище данных в памяти с поддержкой сложных структур (списки, хеши, множества). Он часто используется вместе с PHP для кэширования данных, управления очередями и даже как основная БД для высоконагруженных проектов.

Пример работы с Redis через расширение PhpRedis:

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// Кэшируем список товаров
$cacheKey = 'catalog:popular_products';
$products = $redis->get($cacheKey);

if (!$products) {
    // Выполняем сложный запрос
    $products = getPopularProductsFromDB();
    // Сохраняем в Redis на 1 час (3600 секунд)
    $redis->setex($cacheKey, 3600                

Блоги

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