Skip to content

Serwer aplikacji PHP, napisany w Ruście.

Przemyślana architektura i starannie napisany kod, za którymi stoją lata pracy nad RoadRunnerem.

Wbudowany serwer HTTP oparty na hyperze

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 HTTP

Zero interopu: Rust wywołuje PHP bezpośrednio

Rapira 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ów

PHP 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.

  • php-fpm
  • nginx
  • Angie

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.

  • RoadRunner

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.

  • FrankenPHP

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.

  • Rapira