RoadRunner — это высокопроизводительный сервер приложений PHP, балансировщик нагрузки и менеджер процессов.
RoadRunner написан на языке Go, он прост в установке, по принципу действия заменяет собой PHP-FPM.
Поддерживает xDebug и его аналоги, а также инструменты профилирования и мониторинга, такие как Datadog и New Relic.
Подробнее в документации RoadRunner.
Для правильной работы приложения, запущенного при помощи этой технологии, оно должно быть разработано с поддержкой асинхронного режима. Под этим термином здесь объединены настоящий асинхронный режим и обычный long-runnig режим, так как рекомендации к ним одинаковые.
Под термином "асинхронность" здесь объединены настоящий асинхронный режим и обычный long-running режим, так как рекомендации к ним одинаковы.
В асинхронном режиме переиспользуются загруженные конфигурации фреймворка, классы, инициализированные сервисы, кешированные данные, что значительно ускоряет работу.
Но вместе с этим есть характерные особенности, такие как необходимость больше следить за утечками памяти и устранять блокирующие операции, также многие из привычных сторонних библиотек не поддерживают асинхронный режим.
Хранение состояния (state) в логических частях приложения становится нежелательным, особенно, если оно связано с запросом.
Интерфейсы ResetInterface и RollbackInterface фреймворка предназначены для сброса состояния после каждого асинхронного запроса.
Установка ресурсов сервера RoadRunner производится из официального репозитория: github.com/roadrunner-server/roadrunner.
Под RoadRunner необходимо будет изменить файл /public/index.php, чтобы фреймворк HLEB2 выполнялся в цикле.
Базовый рабочий пример:
Для RoadRunner также нужно создать конфигурационный файл .rr.yaml в корневой директории проекта (предполагается, что скомпилированный файл сервера c названием rr находится там же).
Пример минимальной рабочей конфигурации в .rr.yaml:
version: '3'
server:
command: 'php ./public/index.php'
http:
address: :8088
middleware:
- gzip
- static
static:
dir: public
forbid:
- .php
- .htaccess
pool:
num_workers: 6
max_jobs: 64
debug: false
supervisor:
max_worker_memory: 5
metrics:
address: '127.0.0.1:2113'
В данной конфигурации RoadRunner работа одного процесса (воркера) ограничена по выставленному максимуму допустимой памяти в настройках: http.pool.supervisor.max_worker_memory в мегабайтах. Поэтому, если процесс превысил этот лимит, RoadRunner его правильно завершает и приступает к следующему.
Сервер RoadRunner запускается консольной командой:
$./rr serve
Согласно конфигурации, приложение будет доступно по адресу:
http://localhost:8088
Метрики работы сервера в формате Prometheus:
http://localhost:2113