Llamadas directas entre Rust y PHP
No hay ninguna capa entre Rust y PHP: ni FastCGI, ni sockets, ni Goridge, ni CGO, ni serialización de ningún tipo.
Un servidor de aplicaciones PHP escrito en Rust.
Los mantenedores de RoadRunner diseñan e implementan Rapira.
PHP no incluye un servidor HTTP para producción. Su servidor integrado es una herramienta de desarrollo. php-fpm necesita un servidor web separado, como nginx.
Rapira incluye un servidor HTTP que usa la biblioteca de Rust hyper. Hyper lee cada petición y escribe la respuesta de Rapira.
Peticiones y respuestas HTTPRapira usa Rust, y PHP usa C. Rust llama a funciones de C directamente. Por tanto, Rust puede llamar a una función de PHP directamente. Rapira incrusta el intérprete en el proceso del servidor. Los bindings directos controlan la inicialización del intérprete y el procesamiento de las peticiones.
Rapira no usa FastCGI, Goridge ni CGO. No serializa las peticiones ni las envía a otro proceso. En los modos Classic y Worker, Rapira rellena las superglobales directamente.
Modelo de procesosPHP se ejecuta en procesos separados. El servidor web envía registros FastCGI a través de un socket. El proceso PHP analiza cada petición y devuelve una respuesta serializada.
Los workers de PHP son procesos separados. Reciben del servidor peticiones serializadas a través de pipes o sockets. Goridge define el formato de estos datos.
El proceso del servidor contiene el intérprete de PHP. Pero su host en Go no puede llamar a código C directamente. CGO procesa cada llamada entre los dos lenguajes.
Una ABI define cómo se llaman entre sí los lenguajes compilados. Rust admite la ABI de C directamente. Rust y C usan las mismas instrucciones de máquina para estas llamadas.