PHP, MySQL и нагрузка

Заметки из production о Битриксе под нагрузкой: PHP-FPM, OPcache, файловые сессии, slow query log, binlog, nginx fastcgi_cache, CDN и композитный кэш, блокировки cron и обновление PHP. С настройками и цифрами.

12 статей

File-lock через mkdir в PHP: как я решаю параллельность cron без Redis и mutex

Мне нужно было, чтобы 13 cron-задач никогда не запускались параллельно. Все они работают с одним Chrome-профилем — той же сессией LinkedIn, которую я залогинил руками месяц назад. Два параллельных инстанса и профиль умирает.

Два кэша воюют: CDN против Bitrix Composite

Мы подключили Cloudflare к Bitrix-магазину в четверг вечером. В пятницу утром пошли жалобы: «корзина пустая, хотя добавлял». К субботе — «личный кабинет показывает чужие данные».

Четыре PHP-поведения, которые мы поймали только в проде Bitrix

Мы три дня искали, почему страницы каталога тормозят при конкурентных запросах. Профилировщик показывал: время уходит в ожидание. Nginx — чистый. MySQL — idle. FPM workers — свободны. Оказалось: session_start() ставит файловый lock, и все параллельные запросы одного пользователя выстраиваются в очередь. PHP ведёт себя именно так, как написано в документации. Просто эту страницу документации никто не читает перед деплоем в прод.

PHP 8.4 и Bitrix в production: что реально ломается после обновления

В release notes Bitrix написано: «PHP 8.4 поддерживается». Первый клиент, который обновил staging, получил 47 deprecated notices за один запрос главной страницы и сломанный платёжный модуль. Ни одна из этих проблем не была в ядре Bitrix.

Nginx перед Bitrix: пять строк, которые убирают 600 мс TTFB

У большинства Bitrix-сайтов TTFB выше 700 мс. Не потому что PHP медленный. Потому что Nginx-конфиг лежит нетронутым с того дня, когда хостер его положил — часто в 2016–2017 году.

Bitrix на выделенных ядрах: что стало видно в prod-графиках после переезда с shared-хостинга

Клиент пишет: «Мы всё перенастроили по вашим рекомендациям. OPcache включён, Redis-сессии работают. SQL-индексы тоже — проверяли отдельно. Вечерний пик всё равно роняет сайт».

Как PHP OPcache убивает production Bitrix — и три строки, которые это чинят

Три месяца мы смотрели в slow query log. Перекраивали индексы. Добавляли Redis-кеш там, где его раньше не было. Сайт становился чуть лучше, но страницы каталога иногда виснули на 800-900ms без видимой причины.