Skip to content

用 Rust 编写的 PHP 应用服务器。

RoadRunner 的维护者设计并实现 Rapira。

使用 hyper 的内置 HTTP 服务器

PHP 不包含用于生产环境的 HTTP 服务器。它的内置服务器是开发工具。php-fpm 需要单独的 Web 服务器,例如 nginx。

Rapira 包含一个 HTTP 服务器,它使用 Rust 的 hyper 库。hyper 读取每个请求,并写入 Rapira 生成的响应。

HTTP 请求与响应

Rust 直接调用 PHP

Rapira 用 Rust 编写,PHP 用 C 编写。Rust 直接调用 C 函数。因此,Rust 可以直接调用 PHP 函数。Rapira 把解释器内嵌在服务器进程中。直接绑定控制解释器的初始化和请求处理。

Rapira 不使用 FastCGI、Goridge 或 CGO。它不序列化请求,也不把请求发送到其他进程。在 Classic 模式和 Worker 模式下,Rapira 直接填充超全局变量。

进程模型

PHP 运行在独立进程中。Web 服务器通过 socket 发送 FastCGI 记录。PHP 进程解析每个请求,并返回序列化的响应。

  • php-fpm
  • nginx
  • Angie

PHP worker 是独立进程。它们通过管道或 socket 从服务器接收序列化的请求。Goridge 定义这些数据的格式。

  • RoadRunner

服务器进程包含 PHP 解释器。但是,它的 Go 宿主不能直接调用 C 代码。CGO 处理两种语言之间的每次调用。

  • FrankenPHP

ABI 定义编译型语言之间如何互相调用。Rust 直接支持 C ABI。对于这些调用,Rust 和 C 使用相同的机器指令。

  • Rapira