Нулевой интероп
Между Rust и PHP нет прослойки: ни FastCGI, ни сокетов, ни Goridge, ни CGO, ни какой-либо сериализации.
Сервер для PHP-приложений, написанный на Rust.
Продуманная архитектура и выверенный код, подкреплённые годами работы над RoadRunner.
Парадоксально, но у PHP нет своего production-ready HTTP-сервера. Встроенный годится только для разработки, а php-fpm не работает без внешнего веб-сервера вроде nginx.
Такой сервер даёт Rapira: собственный HTTP-фронт, написанный на Rust поверх hyper. Библиотека hyper - это низкоуровневая реализация HTTP для Rust: она читает каждый запрос из соединения и пишет обратно ответ, который построила Rapira.
HTTP-запросы и ответыRapira написана на Rust, PHP - на C. Rust вызывает функции C напрямую. Поэтому Rust может вызвать функцию PHP напрямую. Rapira встраивает интерпретатор в процесс сервера. Прямые биндинги управляют инициализацией интерпретатора и обработкой запроса.
Здесь нет ни FastCGI, ни Goridge, ни CGO: запрос нигде не сериализуется и не покидает процесс. В режимах Classic и Worker Rapira заполняет суперглобалы напрямую.
Модель процессовPHP работает в отдельных процессах, а веб-сервер общается с ними по сокету бинарным протоколом: каждый запрос упаковывается в FastCGI-записи, передаётся, разбирается на другой стороне - и ответ проделывает тот же путь обратно.
PHP-воркеры - отдельные процессы, которые получают запросы от сервера через пайпы или сокеты. Goridge - протокол этого обмена: каждый запрос и ответ сериализуется на одной стороне и разбирается на другой.
Интерпретатор PHP встроен в процесс сервера, но хост написан на Go, а Go не вызывает C-код напрямую. Каждый вызов проходит через CGO - прослойку с накладными расходами на каждое пересечение границы языков.
ABI - двоичный контракт между компилируемыми языками. Rust поддерживает C ABI нативно: вызов C-функции из Rust - это тот же машинный код, что и вызов из самого C.