Представьте, что ваш сайт — это ресторан. Клиенты приходят, ждут заказ, а повар (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Оптимизация кода: мелочи, которые имеют значение
Мелкие улучшения в коде тоже дают эффект, особенно на больших проектах:
- Используйте echo вместо print — echo быстрее.
- Избегайте лишних вызовов функций — например, count() в цикле.
- Используйте оператор === вместо == — он не приводит типы.
- Храните сессии в Redis — это быстрее, чем в файлах.
Пример: замените медленный код на быстрый.
// Медленно
for ($i = 0; $i < count($arr); $i++) { ... }
// Быстро
$len = count($arr);
for ($i = 0; $i < $len; $i++) { ... }Итоговое резюме
Оптимизация PHP — это не магия, а системный подход. Начните с диагностики, включите кэширование и OPcache, настройте сервер и базу данных. Не забывайте про профилирование — оно покажет, где реальные проблемы. И помните: лучше сделать один раз хорошо, чем потом чинить. Удачи в оптимизации!
Студия WNDER



