Назад в блог

RoadRunner здесь и сейчас

Никита, techlead
Разработка

Для Laravel вышел пакет Laravel Octane который призван подружить Laravel c Swoole и RoadRunner. Мы уже какое-то время используем RoadRunner вместо php-fpm и поделимся своим опытом использования, какие у этого есть плюсы.

RoadRunner – это высокопроизводительный сервер приложения для PHP с открытым исходным кодом написанный на Go. Основное отличие от php-fpm состоит в том, что RoadRunner взаимодействует с долгоживущими php процессами, в отличии от php-fpm, который создает и убивает новый php процесс при каждом запросе. 

Плюсы долгоживущего процесса:

  • Не тратится время на booting
  • Не тратится время на создание подключения к БД
  • Возможность использования in-memory кэша прямо в процессе

Минус такого подхода состоит в том, что он не подходит для всех PHP приложений, т.к. зачастую при написании кода учитывается, что PHP процесс умрет после запроса. Таким образом, нужно уметь следить за утечками памяти, аккуратно работать с глобальным состоянием. Поэтому legacy проекты, скорее всего, на RoadRunner’е на заведутся. 

Однако у RoadRunner’а есть и другие полезные функции, например, обратка статики, сжимание ответа, балансировка. Данные функции в типичной связке падают на nginx. А при использовании RoadRunner’а PHP приложение можно поднять вообще без него (nginx’а).

Так же RoadRunner довольно легко расширяем. Можно использовать его компоненты для собственного application сервера и получить возможность, например, обработки каких-то запросов прямо на Go, работать с websocket’ами.

Сам по себе RoadRunner не новая разработка, ему уже пара лет. Однако при официальной поддержке в виде Laravel Octane можно быть уверенным, что фреймворк готов к работе с ним.

Мы провели небольшой тест на одном реальном проекте, где сравнили скорость php-fpm и roadrunner. Результаты получились следующими:

php-fpm:

plain text: 1150 RPS

single query: 530 RPS

roadrunner:

plain text: 2200 RPS

single query: 1600 RPS

plain text -- запрос отдающий константный JSON

single query -- запрос отдающий результат одного запроса к БД в формате JSON

Виден существенный прирост в скорости, который обусловлен отсутствием времени на booting и использованием постоянного подключения к БД.