Если ваш 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;
?>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) . ' секунд';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. Начни с кэширования, проверь базу данных, профилируй код и обнови версию. Даже пара этих шагов может ускорить твой сайт в разы. Не жди, пока пользователи начнут жаловаться — действуй сейчас.



