Если ваш PHP-сайт тормозит, как улитка под седативным, не спешите винить хостинг или покупать новый сервер. Чаще всего проблема в коде, который можно подкрутить за вечер. В этой статье я расскажу, как выжать максимум из PHP без боли и страданий. Только практика, примеры и лайфхаки.

1. Кэширование: сохраняем результат, а не пересчитываем

Представь, что ты каждый раз заново готовишь утренний кофе, хотя вчерашний ещё стоит в термосе. Примерно так работает PHP без кэша. Он пересчитывает одни и те же данные при каждом запросе. Кэширование — это твой термос. Сохраняй результат тяжёлых операций и отдавай его быстро.

Самый простой способ — использовать OPcache. Он встроен в PHP и кэширует скомпилированный код. Включи его в php.ini:

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000

Для данных используй Memcached или Redis. Пример с Redis:

connect('127.0.0.1', 6379);
$cacheKey = 'user_profile_' . $userId;
$profile = $redis->get($cacheKey);
if (!$profile) {
    $profile = fetchFromDatabase($userId);
    $redis->set($cacheKey, $profile, 3600); // кэш на час
}
echo $profile;
?>
Правило: Кэшируй всё, что не меняется каждую секунду. Даже сложный запрос к БД можно закэшировать на 5-10 минут, если данные не критичны к актуальности.

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

База данных — это обычно самое узкое место. PHP может быть быстрым, но если он ждёт ответа от MySQL, весь сайт встаёт колом. Первое правило — не делай запросы в цикле. Это убивает производительность.

Плохой пример:

$users = getUsers();
foreach ($users as $user) {
    $orders = getOrdersByUserId($user['id']); // запрос в цикле
}

Хороший пример — используй JOIN или подготавливай данные одним запросом:

$query = "SELECT u.*, o.order_date, o.total 
          FROM users u 
          LEFT JOIN orders o ON u.id = o.user_id";
$result = $db->query($query);

Также добавляй индексы на часто используемые поля. Например, если ты часто ищешь пользователей по email, создай индекс:

CREATE INDEX idx_email ON users (email);
ПроблемаРешение
Запросы в циклеИспользуй JOIN или подзапросы
Медленные SELECTДобавь индексы
Большие объёмы данныхИспользуй LIMIT и пагинацию

3. Профилирование: найди узкие места

Не оптимизируй вслепую. Сначала измерь, где твой код тормозит. Для этого есть профилировщики. Самый популярный — Xdebug. Он показывает, сколько времени занимает каждая функция.

Установи Xdebug и включи профилирование. После запуска скрипта ты получишь файл, который можно открыть в инструменте вроде KCachegrind. Там увидишь, что 90% времени уходит на, например, функцию отправки email. Вот её и оптимизируй.

Если Xdebug кажется сложным, используй встроенные функции PHP:

$start = microtime(true);
// твой код
$end = microtime(true);
echo 'Время выполнения: ' . ($end - $start) . ' секунд';
Лайфхак: Включай профилирование только на dev-среде. На продакшене это может замедлить всё ещё больше.

4. Оптимизация кода: мелочи решают

Иногда скорость теряется из-за мелочей. Вот список того, что стоит проверить:

  • Используй echo вместо print — echo быстрее.
  • Избегай лишних вызовов функций в циклах. Например, count($array) лучше вынести в переменную.
  • Используй require_once вместо include, если файл обязателен.
  • Для конкатенации строк используй одинарные кавычки: 'text' . $var быстрее, чем двойные.

Пример плохого кода:

for ($i = 0; $i < count($items); $i++) {
    echo 'Item: ' . $items[$i] . "\n";
}

Хороший код:

$total = count($items);
for ($i = 0; $i < $total; $i++) {
    echo 'Item: ', $items[$i], "\n";
}

5. Использование современных версий PHP

Каждая новая версия PHP быстрее предыдущей. PHP 8.2 работает в 2-3 раза быстрее, чем PHP 5.6. Если ты всё ещё на старой версии, ты теряешь производительность буквально даром. Обновись — это бесплатно.

В PHP 8 появился JIT-компилятор, который ускоряет выполнение кода. Также новые функции, как match() и named arguments, делают код чище и быстрее.

Пример с match():

$status = match ($code) {
    200 => 'OK',
    404 => 'Not Found',
    500 => 'Server Error',
    default => 'Unknown'
};

Старый switch был медленнее и громоздче.

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

Студия WNDER