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