Десять проверенных способов повысить скорость загрузки сайта на PHP

Отключите Xdebug в продакшене – это расширение съедает до 30% времени выполнения скрипта. Оно нужно только при отладке. Убедитесь, что он не загружается в рабочем окружении, особенно в CLI и FPM.

Оптимизируйте работу с автозагрузкой: Composer по умолчанию использует автозагрузчик, который перебирает кучу файлов. Выполните composer dump-autoload -o, чтобы включить классмап. Это сокращает количество файловых операций и уменьшает время на подключение классов.

Не используйте медленные регулярные выражения там, где можно обойтись strpos или str_contains. Регулярки в PHP медленные по сравнению с встроенными строковыми функциями, особенно при большом объёме данных.

Используйте OPcache и включите его агрессивную предварительную загрузку через opcache.preload. Это позволит заранее скомпилировать и загрузить критичные файлы в память при старте PHP. Разница особенно заметна при большом количестве повторяющихся запросов.

Избегайте лишних подключений к базе данных. Кэшируйте результаты, которые не меняются каждую секунду. Redis или Memcached справятся с этим лучше, чем каждый раз дёргать MySQL по пустякам.

Профилируйте код с помощью инструментов вроде Blackfire или Tideways. Это покажет, где именно теряется время. Часто проблема не в PHP, а в медленных SQL-запросах или чрезмерной вложенности циклов.

Сократите использование сторонних библиотек. Многие проекты тянут за собой десятки пакетов, из которых реально используются два класса. Проведите ревизию composer.json и удалите всё, без чего код продолжает работать.

Минимизируйте работу в циклах. Не создавайте объекты внутри итераций без необходимости, не вызывайте тяжёлые функции на каждом шаге. Перенос даже одной операции вне цикла может сэкономить кучу миллисекунд.

Загружайте только нужные данные – не выбирайте SELECT * из базы, если нужно два поля. Не передавайте в шаблон массивы по 10К элементов, если там используются только заголовки.

Как сократить время выполнения PHP-скриптов за счёт использования opcode-кеша

В php.ini убедитесь, что задействованы следующие параметры:

  • opcache.enable=1
  • opcache.memory_consumption=128 – выделяет достаточно памяти для хранения кэша
  • opcache.interned_strings_buffer=16 – уменьшает повторную аллокацию строк
  • opcache.max_accelerated_files=10000 – увеличивает число кэшируемых файлов
  • opcache.validate_timestamps=0 – отключите проверку времени модификации, если код не меняется на лету

Не включайте OPcache только для продакшн-серверов – тестируйте локально с теми же параметрами. Это поможет выявить возможные конфликты до выката.

Для WordPress, Laravel и других популярных фреймворков OPcache даёт прирост до 50–70% по времени ответа – особенно на дешёвом хостинге или при большом числе одновременных обращений.

Проверьте статус кэша через opcache_get_status(), если нужна отладка. Для визуализации используйте скрипт opcache-gui или opcache-status – они показывают, какие файлы кэшируются, сколько памяти используется и когда происходят сбросы.

Какие PHP-функции замедляют выполнение кода и чем их заменить

Избегай `preg_replace()` без флага `PREG_REPLACE_EVAL` – он грузит больше ресурсов, чем `str_replace()` или `strpos()` с `substr()`, особенно при простых шаблонах. Там, где можно обойтись строковыми функциями, делай это.

Функция `file_get_contents()` при работе с удалёнными URL работает медленно и нестабильно. Вместо неё используй cURL с правильно настроенными тайм-аутами и повторными попытками. Это надёжнее и быстрее при работе с сетью.

`array_merge()` медленнее, чем оператор `+` при объединении массивов с разными ключами. Если важен только ключ и значение, используй `+`.

`foreach` по массиву, возвращаемому функцией, тормозит. Сохрани результат функции в переменную перед циклом – меньше вызовов, меньше затрат.

Функция `count()` внутри циклов – частая ошибка. Вычисляй длину массива один раз до цикла и сохраняй в переменную.

Не используй `eval()` – это медленно и опасно. В большинстве случаев можно переписать логику без динамического выполнения кода.

Частые вызовы `dirname(__FILE__)` или `__DIR__` можно сократить, определив константу в начале скрипта, особенно если путь используется много раз.