RoadRunner 高性能的 PHP 应用程序服务器
RoadRunner 是一个高性能的 PHP 应用程序服务器
PHP RoadRunner 是一个高性能的应用服务器,用于运行 PHP 应用程序。它是一个由 Golang 编写的多功能工具,结合了 HTTP 服务器、任务管理器和进程管理器,可以显著提升 PHP 应用的性能和吞吐量。
RoadRunner 的设计目标是取代传统的 PHP-FPM(FastCGI Process Manager)运行模式,避免 PHP 的启动和销毁开销,从而提高性能。它特别适合高并发和需要持久连接的场景,比如微服务、API 网关、队列处理等。
Github
https://github.com/roadrunner-server/roadrunner
Docs
https://docs.roadrunner.dev/docs
性能对比
Performance benchmark of PHP runtimes
https://dev.to/dimdev/performance-benchmark-of-php-runtimes-2lmc
==由于 FrankenPHP 的出现,无论是易用性和性能都强于 RoadRunner, 且存在 Swoole 这样的选择==
概述
RoadRunner 的特点
高性能:
- RoadRunner 运行在 Go 语言编写的 HTTP 服务器之上,性能比传统的 PHP-FPM 更高,尤其是在处理大量并发请求时。
长驻进程:
- 使用 RoadRunner,PHP 的脚本会以“常驻进程”的方式运行。传统 PHP-FPM 每次执行请求时都会启动一个 PHP 进程并加载应用,而 RoadRunner 保持 PHP 脚本在内存中常驻,从而避免请求间的初始化和启动开销。
协程支持:
- 作为 Go 语言的产物,RoadRunner 可以支持协程和异步操作,能够处理大量的并发任务。
易于扩展:
- RoadRunner 提供模块化结构,可以通过插件扩展功能,比如 WebSocket、gRPC、任务队列、定时任务等。
跨平台支持:
- 它可以运行在 Linux、Windows 和 macOS 等平台上。
与流行框架兼容:
- RoadRunner 支持 Laravel、Symfony 等主流 PHP 框架,而且可以很好地与现代 PHP 开发工具(如 Composer)结合。
RoadRunner 的工作流程
服务器启动:
- RoadRunner 作为一个 HTTP 服务器启动,在接收到客户端请求时,它会根据配置将请求转发给 PHP 脚本处理。
请求处理:
- PHP 脚本被保留为常驻进程,避免了传统 PHP-FPM 中每次请求都要重新加载类和引导框架的开销。
响应返回:
- PHP 脚本处理完成后,RoadRunner 将响应返回给客户端。
对比 PHP-FPM 和 RoadRunner
特性 | PHP-FPM | RoadRunner |
---|---|---|
性能 | 初始化开销较大,性能较低 | 长驻进程,无需重复初始化,性能更高 |
并发处理 | 依赖 PHP-FPM 配置的进程池 | Golang 提供更高并发能力 |
内存使用 | 每次请求加载后释放内存 | 脚本常驻内存,持续使用,占用更多内存 |
异步支持 | 无法原生支持 | 支持协程、异步处理 |
易用性 | PHP 开发者熟悉 | 需要额外学习和配置 |
扩展性 | 受限于 PHP-FPM | 插件化架构,可扩展性极高 |
常见使用场景
高性能 HTTP 服务器:
- 替代传统的 PHP-FPM,处理高并发的 HTTP 请求。
任务队列:
- 内置任务队列功能,可以更高效地处理任务。
WebSocket 和 gRPC 服务:
- RoadRunner 支持 WebSocket 和 gRPC,适合实时通信和微服务场景。
微服务架构:
- 非常适合用在基于 PHP 构建的微服务系统中。
安装和使用
安装 RoadRunner:
- 你可以从 RoadRunner 官方 GitHub 下载二进制文件。
- 或使用 Composer 在项目中安装相关插件,例如 RoadRunner Bridge。
配置 RoadRunner:
- 使用
rr.yaml
文件进行配置,包括端口、HTTP 配置、任务队列等。
- 使用
启动 RoadRunner:
- 在项目目录中运行
./rr serve
命令,即可启动 RoadRunner 服务器。
- 在项目目录中运行
与框架集成:
- 对于 Laravel 等框架,可以使用现成的桥接包(如
spiral/roadrunner-laravel
)快速完成集成。
- 对于 Laravel 等框架,可以使用现成的桥接包(如
优缺点
优点:
- 高性能,高并发。
- 避免重复加载框架或脚本,节省服务器资源。
- 支持异步任务和协程。
- 插件化,可扩展性强。
- 非常适合现代微服务架构和高性能需求的应用。
缺点:
- 占用内存较高,适合高流量应用(低流量应用可能浪费资源)。
- 对开发者友好度稍低,需要学习和配置。
- 常驻进程模式对代码的“无状态性”要求较高,可能需要重构部分代码以避免状态问题(如未清理的全局变量)。
总结
PHP RoadRunner 是一个现代、高性能的 PHP 应用服务器,特别适合需要处理高并发、实时通信或者微服务场景的应用。相比传统的 PHP-FPM 模式,它通过长驻进程和 Golang 的高效运行模式,大幅提高了请求处理速度和吞吐量。如果你的应用对性能有较高要求,或者需要异步任务和实时功能,RoadRunner 是一个值得研究和尝试的解决方案。
入门使用
PHP RoadRunner 教程:快速上手与应用
什么是 RoadRunner?
RoadRunner 是一个用 Golang 编写的高性能 PHP 应用服务器,适用于运行现代 PHP 应用程序。相比传统的 PHP-FPM,RoadRunner 提供了更高的性能和灵活性,支持长驻进程、任务队列、WebSocket、gRPC 等功能,非常适合高并发和微服务场景。
RoadRunner 的核心功能
- 快速、高效的 HTTP 和 HTTPS 服务器。
- 支持常驻 PHP 进程,避免每次请求的初始化开销。
- 内置任务队列和多种插件(如 WebSocket、gRPC)。
- 与主流框架(如 Laravel、Symfony)兼容。
- 支持协程和异步处理。
安装 RoadRunner
以下是几步简单的安装过程:
1. 下载 RoadRunner
你可以从 RoadRunner 官方 GitHub 下载二进制文件。或者直接使用 Composer 包管理器安装:
composer require spiral/roadrunner
2. 安装二进制文件
使用 spiral/roadrunner
包后,需要下载 RoadRunner 二进制文件:
vendor/bin/rr get
这会在 vendor/bin
目录下生成一个 rr
可执行文件。
配置 RoadRunner
RoadRunner 的配置文件通常是一个 yaml
文件,默认名为 rr.yaml
。以下是一个简单的配置模板:
version: "3"
server:
command: "php worker.php" # PHP 工作脚本
http:
address: "0.0.0.0:8080" # HTTP 监听地址
middleware: [ "static" ] # 静态文件中间件
static:
dir: "public" # 静态文件目录
forbid: [ ".php" ] # 禁止访问的文件类型
rpc:
enable: true
listen: "tcp://127.0.0.1:6001" # RPC 服务地址
配置说明:
server.command
是执行 PHP 应用的入口文件(如 Laravel 的artisan
命令)。http.address
指定 HTTP 服务器监听的地址和端口。static.dir
定义静态资源所在的目录。rpc
用于启用和配置远程过程调用(适用于任务队列等功能)。
创建 PHP Worker
RoadRunner 使用 PHP 脚本来处理传入的 HTTP 请求。以下是一个简单的 PHP Worker 示例:
<?php
use Spiral\RoadRunner\Worker;
use Nyholm\Psr7\Factory\Psr17Factory;
use Spiral\RoadRunner\Http\PSR7Worker;
require 'vendor/autoload.php';
$worker = Worker::create();
$psrFactory = new Psr17Factory();
$psr7Worker = new PSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory);
while ($request = $psr7Worker->waitRequest()) {
try {
$response = $psrFactory
->createResponse(200)
->withHeader('Content-Type', 'text/plain');
$response->getBody()->write('Hello, RoadRunner!');
$psr7Worker->respond($response);
} catch (\Throwable $e) {
$psr7Worker->getWorker()->error((string)$e);
}
}
将上面的代码保存为 worker.php
,并在 rr.yaml
文件中配置 server.command: "php worker.php"
。
启动 RoadRunner
运行以下命令启动 RoadRunner:
./rr serve
如果配置正确,RoadRunner 将启动 HTTP 服务器,监听在 http://127.0.0.1:8080
。
访问 http://127.0.0.1:8080,你会看到 Hello, RoadRunner!
的响应。
集成 Laravel(或其他框架)
RoadRunner 可以与 Laravel 等主流框架无缝集成。以下是集成 Laravel 的步骤:
1. 安装依赖
composer require spiral/roadrunner-laravel
2. 生成配置文件
运行以下命令为 Laravel 创建配置文件:
php artisan vendor:publish --provider="Spiral\RoadRunnerLaravel\Providers\RoadRunnerServiceProvider"
3. 修改 rr.yaml
文件
使用以下配置模板:
version: "3"
server:
command: "php artisan octane:start --server=roadrunner --host=0.0.0.0 --port=8080"
http:
address: "0.0.0.0:8080"
4. 启动 RoadRunner
运行以下命令启动:
./rr serve
RoadRunner 将作为 Laravel 的服务器运行,你就可以通过 http://127.0.0.1:8080
访问你的 Laravel 应用。
使用任务队列
RoadRunner 内置了强大的任务队列功能,可以用来处理异步任务。
配置任务队列
在 rr.yaml
文件中添加以下内容:
jobs:
pipelines:
example:
driver: memory # 使用内存队列
创建队列 Worker
你的 PHP 脚本(如 queue-worker.php
)可能如下所示:
<?php
use Spiral\RoadRunner\Jobs\Consumer;
use Spiral\RoadRunner\Worker;
require 'vendor/autoload.php';
$consumer = new Consumer(Worker::create());
while ($task = $consumer->waitTask()) {
$payload = $task->getPayload();
echo "Processing task: " . $payload . PHP_EOL;
$task->complete(); // 标记任务为完成
}
在 rr.yaml
中配置 server.command
为队列脚本:
server:
command: "php queue-worker.php"
启动 RoadRunner 后,你可以通过 RPC 将任务推送到队列中。
更多功能
RoadRunner 还支持以下功能:
- WebSocket:实现实时通信。
- gRPC:用于高效的微服务通信。
- 定时任务:类似于
cron
的计划任务功能。 - 插件系统:通过插件扩展功能,比如日志记录、限流等。
总结
RoadRunner 是一个现代化的 PHP 应用服务器,特别适合高性能、高并发的场景。通过其长驻进程设计和 Go 语言的高效运行模式,它可以显著提高 PHP 应用的响应速度和吞吐量。
RoadRunner 的学习曲线可能稍陡,但一旦掌握,你的 PHP 应用将获得巨大的性能提升。希望本教程能帮助你快速上手 RoadRunner,利用其强大的功能构建高效的 PHP 服务!