Skip to content

Сервер для PHP-приложений, написанный на Rust.

Продуманная архитектура и выверенный код, подкреплённые годами работы над RoadRunner.

Встроенный HTTP-сервер, построенный на hyper

Парадоксально, но у PHP нет своего production-ready HTTP-сервера. Встроенный годится только для разработки, а php-fpm не работает без внешнего веб-сервера вроде nginx.

Такой сервер даёт Rapira: собственный HTTP-фронт, написанный на Rust поверх hyper. Библиотека hyper - это низкоуровневая реализация HTTP для Rust: она читает каждый запрос из соединения и пишет обратно ответ, который построила Rapira.

HTTP-запросы и ответы

Нулевой интероп: Rust вызывает PHP напрямую

Rapira написана на Rust, PHP - на C. Rust вызывает функции C напрямую. Поэтому Rust может вызвать функцию PHP напрямую. Rapira встраивает интерпретатор в процесс сервера. Прямые биндинги управляют инициализацией интерпретатора и обработкой запроса.

Здесь нет ни FastCGI, ни Goridge, ни CGO: запрос нигде не сериализуется и не покидает процесс. В режимах Classic и Worker Rapira заполняет суперглобалы напрямую.

Модель процессов

PHP работает в отдельных процессах, а веб-сервер общается с ними по сокету бинарным протоколом: каждый запрос упаковывается в FastCGI-записи, передаётся, разбирается на другой стороне - и ответ проделывает тот же путь обратно.

  • php-fpm
  • nginx
  • Angie

PHP-воркеры - отдельные процессы, которые получают запросы от сервера через пайпы или сокеты. Goridge - протокол этого обмена: каждый запрос и ответ сериализуется на одной стороне и разбирается на другой.

  • RoadRunner

Интерпретатор PHP встроен в процесс сервера, но хост написан на Go, а Go не вызывает C-код напрямую. Каждый вызов проходит через CGO - прослойку с накладными расходами на каждое пересечение границы языков.

  • FrankenPHP

ABI - двоичный контракт между компилируемыми языками. Rust поддерживает C ABI нативно: вызов C-функции из Rust - это тот же машинный код, что и вызов из самого C.

  • Rapira