Zero interopu
Między Rustem a PHP nie ma żadnej warstwy pośredniej: ani FastCGI, ani socketów, ani Goridge, ani CGO, ani jakiejkolwiek serializacji.
Serwer aplikacji PHP, napisany w Ruście.
Przemyślana architektura i starannie napisany kod, za którymi stoją lata pracy nad RoadRunnerem.
Paradoksalnie, PHP nie ma własnego serwera HTTP gotowego do produkcji: wbudowany to wyłącznie narzędzie deweloperskie, a php-fpm nie działa bez zewnętrznego serwera WWW takiego jak nginx.
Rapira dostarcza taki serwer: własny front HTTP napisany w Ruście na bibliotece hyper. Hyper to niskopoziomowa implementacja HTTP dla Rusta. Czyta każde żądanie z połączenia i odsyła z powrotem odpowiedź, którą przygotowała Rapira.
Żądania i odpowiedzi HTTPRapira jest napisana w Ruście, a PHP - w C. Rust wywołuje funkcje C natywnie. Wywołanie funkcji PHP z Rusta jest więc bezpośrednim wywołaniem funkcji. Interpreter jest wbudowany w proces serwera. Rapira steruje nim przez bezpośrednie bindingi, od startu silnika po obsługę każdego żądania.
Nie ma tu ani FastCGI, ani Goridge, ani CGO: żądanie nigdzie nie jest serializowane i nie opuszcza procesu. W trybie Classic i w trybie Worker Rapira wypełnia zmienne superglobalne bezpośrednio.
Model procesówPHP działa w osobnych procesach, a serwer WWW komunikuje się z nimi przez socket binarnym protokołem: każde żądanie jest pakowane w rekordy FastCGI, przesyłane i rozpakowywane po drugiej stronie, a odpowiedź pokonuje tę samą drogę z powrotem.
Workery PHP to osobne procesy, które odbierają żądania od serwera przez potoki lub sockety. Goridge to protokół tej wymiany: każde żądanie i odpowiedź są serializowane po jednej stronie i odczytywane po drugiej.
Interpreter PHP jest wbudowany w proces serwera, ale host jest napisany w Go, a Go nie potrafi wywoływać kodu C bezpośrednio. Każde wywołanie przechodzi przez CGO - warstwę, która dokłada narzut przy każdym przekroczeniu granicy języków.
ABI to binarny kontrakt między językami kompilowanymi. Rust obsługuje C ABI natywnie: wywołanie funkcji C z Rusta kompiluje się do tego samego kodu maszynowego co wywołanie z samego C.