Rust 与 PHP 直接调用
Rust 与 PHP 之间没有中间层:没有 FastCGI,没有 socket,没有 Goridge,没有 CGO,也没有任何序列化。
PHP 不包含用于生产环境的 HTTP 服务器。它的内置服务器是开发工具。php-fpm 需要单独的 Web 服务器,例如 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 运行在独立进程中。Web 服务器通过 socket 发送 FastCGI 记录。PHP 进程解析每个请求,并返回序列化的响应。
PHP worker 是独立进程。它们通过管道或 socket 从服务器接收序列化的请求。Goridge 定义这些数据的格式。
服务器进程包含 PHP 解释器。但是,它的 Go 宿主不能直接调用 C 代码。CGO 处理两种语言之间的每次调用。
ABI 定义编译型语言之间如何互相调用。Rust 直接支持 C ABI。对于这些调用,Rust 和 C 使用相同的机器指令。