🧱 Суть
Производительность PHP-приложения зависит не только от скорости выполнения кода, но и от количества обращений к базе данных, файловой системе и внешним API.
Кэширование (Caching) – это способ сохранить результат вычислений или запросов, чтобы повторно использовать его без повторного выполнения.
Например:
Запрос
↓
Проверка кэша
↓
Есть кэш? ── Да ──► вернуть данные
│
Нет
↓
Выполнить запрос
↓
Сохранить в кэш
↓
Вернуть данныеПравильное кэширование снижает нагрузку на сервер и ускоряет работу приложения.
📦 Проблема
Без оптимизации приложение может выполнять одни и те же операции при каждом запросе.
Например:
$users = $repository->getUsers();Если запрос выполняется сотни раз в минуту, база данных получает лишнюю нагрузку.
Похожая ситуация возникает при:
- чтении файлов
- обращении к REST API
- сложных вычислениях
- генерации HTML
✅ Решение
Для повышения производительности используют:
- OPcache
- кэширование данных
- кэширование запросов
- уменьшение количества обращений к БД
- оптимизацию алгоритмов
- профилирование приложения
💻 Код
OPcache
OPcache – встроенный механизм кэширования PHP-кода.
Без OPcache:
PHP-файл
↓
Компиляция
↓
ВыполнениеПри каждом запросе код компилируется заново.
С OPcache:
Первый запрос
↓
Компиляция
↓
Сохранение в памятьПоследующие запросы:
PHP-файл
↓
Готовый байткод
↓
ВыполнениеКомпиляция больше не требуется.
Проверить OPcache
<?php
phpinfo();или:
var_dump(opcache_get_status());Кэширование данных
Если данные редко изменяются, их можно сохранить в памяти.
Например:
База данных
↓
Получить список городов
↓
Сохранить в кэшСледующие запросы используют уже готовый результат.
Кэширование API
Плохо:
$data = getWeather();При каждом открытии страницы выполняется HTTP-запрос.
Лучше:
Проверить кэш
↓
Есть данные?
↓ ↓
Да Нет
↓ ↓
Вернуть Запрос к API
кэш ↓
СохранитьКэширование файлов
Если файл читается часто:
$config = file_get_contents('config.json');можно сохранить его содержимое в памяти и не читать диск повторно.
Кэширование HTML
Некоторые страницы почти не изменяются.
Например:
- главная страница
- новости
- каталог товаров
Их можно один раз сгенерировать и сохранить готовый HTML.
Следующие пользователи получат уже готовую страницу.
Оптимизация запросов к БД
Плохо:
100 пользователей
↓
100 отдельных SQL-запросовЛучше:
1 SQL-запрос
↓
100 пользователейЧем меньше запросов к базе данных, тем быстрее работает приложение.
Избегать повторных вычислений
Плохо:
foreach ($users as $user) {
expensiveCalculation();
}Если результат одинаковый, лучше вычислить его один раз.
Использовать встроенные функции
Встроенные функции PHP написаны на C и обычно работают быстрее пользовательских реализаций.
Например:
array_map();
array_filter();
array_merge();обычно предпочтительнее собственных аналогов.
Индексы базы данных
Даже идеально написанный PHP-код не спасёт медленные SQL-запросы.
Например:
SELECT *
FROM users
WHERE email = ?;Поиск по индексированному полю выполняется значительно быстрее.
Профилирование
Перед оптимизацией важно определить, где именно приложение тратит время.
Для этого используют:
- Xdebug
- Blackfire
- Laravel Debugbar
- Symfony Profiler
Это помогает найти реальные узкие места.
Частые ошибки
Оптимизировать без измерений
Плохо:
Сначала переписывать код, не понимая, что именно тормозит.
Лучше:
Сначала измерить производительность, затем оптимизировать найденные проблемы.
Кэшировать всё подряд
Если данные изменяются часто, кэш может стать неактуальным.
Необходимо учитывать время жизни кэша (TTL) и своевременно его очищать.
Забывать очищать кэш
Например:
Пользователь обновил профильЕсли кэш не сбросить, приложение продолжит показывать старые данные.
Выполнять лишние SQL-запросы
Например:
foreach ($users as $user) {
getOrders($user['id']);
}Такой подход создаёт проблему N+1 запросов.
Лучше получить все необходимые данные одним запросом.
Отключать OPcache на продакшене
Без OPcache PHP будет компилировать каждый файл при каждом запросе, что существенно снижает производительность.
🎯 Вывод
- Производительность зависит не только от скорости PHP-кода, но и от работы с БД, файлами и внешними сервисами
- OPcache кэширует скомпилированный PHP-код и значительно ускоряет выполнение приложения
- Кэширование позволяет избежать повторных запросов и вычислений
- Наибольший эффект обычно даёт оптимизация SQL-запросов и уменьшение их количества
- Перед оптимизацией стоит определить реальные узкие места с помощью профилирования
- Использование кэширования должно сопровождаться правильным управлением сроком жизни данных
🔗 Связано
- PHP. SQL через PDO
- PHP. Подготовленные запросы и защита от SQL Injection
- PHP. Работа с REST API (curl)
- PHP. Работа с файлами и файловой системой
- PHP. Отладка (var_dump, print_r, Xdebug)
- PHP. Полезные встроенные функции
- PHP. Основы ООП в PHP
- Backend. Кэширование
- Backend. Производительность приложений