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

Почему PHP тормозит? Типичные проблемы

PHP сам по себе не медленный. Проблемы обычно в коде и окружении. Вот частые причины:

  • Медленные запросы к базе данных — например, N+1 запросов вместо одного.
  • Отсутствие кэширования — каждый раз генерируем одно и то же.
  • Неоптимальные алгоритмы — циклы внутри циклов, лишние вычисления.
  • Слабая конфигурация сервера — мало памяти или процессора.

Диагностика — первый шаг. Используйте профайлеры, такие как Xdebug или Blackfire, чтобы найти узкие места.

Кэширование: ваш лучший друг

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

Тип кэшаПримерКогда использовать
OPcacheВстроенный в PHPКэширует скомпилированный код, ускоряет выполнение скриптов
Кэш данныхRedis, MemcachedХранит результаты запросов, сессии
Кэш страницVarnish, Nginx FastCGIГотовые HTML-страницы для анонимных пользователей

Включите OPcache — это даст прирост 30-50% без изменения кода. Пример настройки в php.ini:

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
Правило: Кэшируйте всё, что не меняется часто. Даже если кэш устареет на пару секунд, это лучше, чем ждать генерации.

Оптимизация запросов к базе данных

База данных — главный тормоз. Вот как ускорить работу с ней:

  • Используйте индексы — они как оглавление в книге. Без них SQL сканирует все строки.
  • Избегайте N+1 запросов — в ORM (например, Eloquent) используйте жадную загрузку (eager loading).
  • Ограничивайте выборку — не запрашивайте 1000 записей, если нужны только 10.
  • Кэшируйте результаты — особенно для отчетов и статистики.

Пример плохого кода (N+1):

$users = User::all();
foreach ($users as $user) {
    echo $user->profile->bio; // каждый раз новый запрос
}

Исправленный вариант:

$users = User::with('profile')->get();
foreach ($users as $user) {
    echo $user->profile->bio; // один запрос с JOIN
}

Профилирование и мониторинг

Не гадайте, где тормозит — измеряйте. Используйте инструменты:

  • Xdebug — классический профайлер, показывает время выполнения каждой функции.
  • Blackfire — продвинутый, с визуализацией.
  • Tideways — для продакшена, с низким оверхедом.

Профилирование помогает найти «горячие точки» — код, который выполняется дольше всего. Обычно это циклы, работа с файлами или сложные вычисления. Пример профилирования с Xdebug:

// Включите в php.ini
xdebug.mode=profile
xdebug.output_dir=/tmp/profiles

После запуска скрипта смотрите файлы в /tmp/profiles и анализируйте через KCacheGrind.

Настройка сервера и окружения

Иногда проблема не в коде, а в сервере. Вот что можно сделать:

  • Используйте PHP-FPM — он быстрее, чем mod_php в Apache.
  • Настройте пулы процессов — не давайте PHP съесть всю память.
  • Включите сжатие — gzip для ответов уменьшает трафик.
  • Используйте CDN — для статики (CSS, JS, картинки).

Пример настройки пула PHP-FPM (www.conf):

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
Лайфхак: Используйте Nginx как reverse proxy перед PHP-FPM. Он отдаёт статику быстрее и снижает нагрузку на PHP.

Оптимизация кода: мелочи, которые имеют значение

Мелкие улучшения в коде тоже дают эффект, особенно на больших проектах:

  • Используйте echo вместо print — echo быстрее.
  • Избегайте лишних вызовов функций — например, count() в цикле.
  • Используйте оператор === вместо == — он не приводит типы.
  • Храните сессии в Redis — это быстрее, чем в файлах.

Пример: замените медленный код на быстрый.

// Медленно
for ($i = 0; $i < count($arr); $i++) { ... }

// Быстро
$len = count($arr);
for ($i = 0; $i < $len; $i++) { ... }

Итоговое резюме

Оптимизация PHP — это не магия, а системный подход. Начните с диагностики, включите кэширование и OPcache, настройте сервер и базу данных. Не забывайте про профилирование — оно покажет, где реальные проблемы. И помните: лучше сделать один раз хорошо, чем потом чинить. Удачи в оптимизации!

Студия WNDER