RoadRunner ускоряет PHP, оставляя приложение в памяти
https://www.youtube-nocookie.com/embed/RUm94xCaXMo
Автор: Антон Титов (SpiralScout) · PHP Russia 2019
Классическая модель PHP начинает каждый запрос почти с чистого состояния: загружает приложение, создаёт контейнер и после отправки ответа освобождает процесс. RoadRunner сохраняет PHP worker между запросами — и тем самым превращает прежнюю гарантию очистки в ответственность разработчика.
Антон Титов показывает гибридную архитектуру, в которой сервер на Go принимает запросы и управляет долгоживущими PHP-процессами. Приложение не нужно загружать заново для каждого обращения, поэтому уменьшается стоимость инициализации. На уровне HTTP автор заявляет ускорение примерно в двадцать раз, хотя такой результат относится к конкретному benchmark, а не к любому PHP-проекту.
У производительности есть обратная сторона. Объект, соединение или пользовательский контекст теперь способны пережить запрос, для которого были созданы. PHP-приложение должно работать как настоящий долгоживущий сервис, а не рассчитывать, что процесс автоматически уничтожит всё состояние.
Кому смотреть: PHP-разработчикам, которые рассматривают RoadRunner, FrankenPHP или другую модель долгоживущих workers.
Из этого можно взять в работу: проверить сервисы и singleton-объекты приложения на данные текущего пользователя, запроса или транзакции, которые могут остаться в памяти после ответа.
RoadRunner разделяет инфраструктурную и прикладную части. Процесс на Go слушает сеть, принимает запросы и передаёт их PHP workers. PHP загружает framework и приложение один раз, после чего worker последовательно обрабатывает несколько запросов.
Так устраняется повторная инициализация, но меняется жизненный цикл памяти. В традиционной модели ошибка часто ограничена одним запросом: завершение процесса очищает глобальное состояние, статические свойства и незакрытые ресурсы. В долгоживущем worker всё это способно накопиться или попасть к следующему пользователю.
Поэтому особое значение получают освобождение ссылок, сброс состояния контейнера и корректная работа с соединениями. Код, который был безопасен только из-за короткой жизни PHP-процесса, приходится пересматривать.
Доклад не ограничивается HTTP. В официальном описании упоминаются очереди, конфигурация через Consul и etcd, Prometheus, JWT и gRPC. Общий принцип остаётся тем же: Go берёт на себя транспорт и управление процессами, а PHP сохраняет бизнес-логику и привычную экосистему.
Заявленное двадцатикратное ускорение нельзя переносить на любой сервис без повторного измерения. Если запрос большую часть времени ждёт базу или внешний API, устранение загрузки framework даст меньший эффект. Но сам архитектурный обмен сохраняется: RoadRunner покупает производительность за счёт долгой жизни процесса, а вместе с ней команда получает новые требования к изоляции состояния.
Original post: https://territory.network/@engineers-tail/161/roadrunner-uskoriaet-php-ostavliaia-prilozhenie-v-pamiati