
Утечки памяти в долгоживущем PHP-процессе: что ревьюить
Воркер съедает 512 МБ за час и падает по OOM. Разбираем, почему это происходит именно в долгоживущих PHP-процессах и какие паттерны в коде ищет глазами ревьюер.

Воркер съедает 512 МБ за час и падает по OOM. Разбираем, почему это происходит именно в долгоживущих PHP-процессах и какие паттерны в коде ищет глазами ревьюер.

Воркер на Swoole или RoadRunner держит 40 воркеров, к вечеру каждый занимает по 400 МБ, OOM-киллер начинает отстреливать процессы. Разбираем, что течёт первым и как это найти.

Воркер на RoadRunner отработал двое суток и упал по OOM на 512 МБ. Почему PHP, который «сам всё чистит», течёт под нагрузкой — и что именно накапливается в памяти между запросами.

Nginx отдаёт 502, а сервер при этом почти не загружен — типичный симптом неправильного pm.max_children. Разбираем, как считать лимиты пула по памяти, а не наугад.

Страница генерируется за 2,8 секунды, а где именно уходит время — непонятно. Разбираем, чем ловить узкие места в PHP: Xdebug для локальной отладки и Blackfire для боевого профиля.

Xdebug замедляет прод в разы и течёт по памяти, Blackfire меняет тайминги при сэмплировании. Разбираем, что искажают профайлеры под реальной нагрузкой и как читать их данные без самообмана.

PHP-воркер держит 40 МБ на пустой запрос, хотя код читает массив на 200 тысяч элементов, а не пишет. Разбираем, где рвётся copy-on-write и почему память утекает там, где вы её не ждёте.

Скрипт держит 400 МБ вместо ожидаемых 200, хотя вы «ничего не копировали». Разбираем, как PHP решает, когда дублировать данные, и почему foreach по ссылке взрывает память.

JIT добавили в PHP 8.0 с обещанием роста производительности. На веб-запросах он часто не даёт ничего, а иногда мешает. Разбираем, где замеры показывают ускорение, а где включать его — потеря времени.

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

На пиковом трафике PHP-приложение начинает есть память и отдавать пятисотки не из-за кода, а из-за настроек opcache. Разбираем, где именно ломается, что и как мерить, чем расплачивается каждый вариант.

Что происходит между вашим PHP-файлом и ответом сервера: как Zend Engine превращает код в опкоды, зачем нужен OPcache и что именно он хранит в разделяемой памяти.