RoadRunner 是一个高性能的 PHP 应用程序服务器

PHP RoadRunner 是一个高性能的应用服务器,用于运行 PHP 应用程序。它是一个由 Golang 编写的多功能工具,结合了 HTTP 服务器、任务管理器和进程管理器,可以显著提升 PHP 应用的性能和吞吐量。

RoadRunner 的设计目标是取代传统的 PHP-FPM(FastCGI Process Manager)运行模式,避免 PHP 的启动和销毁开销,从而提高性能。它特别适合高并发和需要持久连接的场景,比如微服务、API 网关、队列处理等。

官网
https://roadrunner.dev/

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 的特点

  1. 高性能:

    • RoadRunner 运行在 Go 语言编写的 HTTP 服务器之上,性能比传统的 PHP-FPM 更高,尤其是在处理大量并发请求时。
  2. 长驻进程:

    • 使用 RoadRunner,PHP 的脚本会以“常驻进程”的方式运行。传统 PHP-FPM 每次执行请求时都会启动一个 PHP 进程并加载应用,而 RoadRunner 保持 PHP 脚本在内存中常驻,从而避免请求间的初始化和启动开销。
  3. 协程支持:

    • 作为 Go 语言的产物,RoadRunner 可以支持协程和异步操作,能够处理大量的并发任务。
  4. 易于扩展:

    • RoadRunner 提供模块化结构,可以通过插件扩展功能,比如 WebSocket、gRPC、任务队列、定时任务等。
  5. 跨平台支持:

    • 它可以运行在 Linux、Windows 和 macOS 等平台上。
  6. 与流行框架兼容:

    • RoadRunner 支持 Laravel、Symfony 等主流 PHP 框架,而且可以很好地与现代 PHP 开发工具(如 Composer)结合。

RoadRunner 的工作流程

  1. 服务器启动:

    • RoadRunner 作为一个 HTTP 服务器启动,在接收到客户端请求时,它会根据配置将请求转发给 PHP 脚本处理。
  2. 请求处理:

    • PHP 脚本被保留为常驻进程,避免了传统 PHP-FPM 中每次请求都要重新加载类和引导框架的开销。
  3. 响应返回:

    • PHP 脚本处理完成后,RoadRunner 将响应返回给客户端。

对比 PHP-FPM 和 RoadRunner

特性PHP-FPMRoadRunner
性能初始化开销较大,性能较低长驻进程,无需重复初始化,性能更高
并发处理依赖 PHP-FPM 配置的进程池Golang 提供更高并发能力
内存使用每次请求加载后释放内存脚本常驻内存,持续使用,占用更多内存
异步支持无法原生支持支持协程、异步处理
易用性PHP 开发者熟悉需要额外学习和配置
扩展性受限于 PHP-FPM插件化架构,可扩展性极高

常见使用场景

  1. 高性能 HTTP 服务器:

    • 替代传统的 PHP-FPM,处理高并发的 HTTP 请求。
  2. 任务队列:

    • 内置任务队列功能,可以更高效地处理任务。
  3. WebSocket 和 gRPC 服务:

    • RoadRunner 支持 WebSocket 和 gRPC,适合实时通信和微服务场景。
  4. 微服务架构:

    • 非常适合用在基于 PHP 构建的微服务系统中。

安装和使用

  1. 安装 RoadRunner:

    • 你可以从 RoadRunner 官方 GitHub 下载二进制文件。
    • 或使用 Composer 在项目中安装相关插件,例如 RoadRunner Bridge。
  2. 配置 RoadRunner:

    • 使用 rr.yaml 文件进行配置,包括端口、HTTP 配置、任务队列等。
  3. 启动 RoadRunner:

    • 在项目目录中运行 ./rr serve 命令,即可启动 RoadRunner 服务器。
  4. 与框架集成:

    • 对于 Laravel 等框架,可以使用现成的桥接包(如 spiral/roadrunner-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 服务地址

配置说明:

  1. server.command 是执行 PHP 应用的入口文件(如 Laravel 的 artisan 命令)。
  2. http.address 指定 HTTP 服务器监听的地址和端口。
  3. static.dir 定义静态资源所在的目录。
  4. 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 还支持以下功能:

  1. WebSocket:实现实时通信。
  2. gRPC:用于高效的微服务通信。
  3. 定时任务:类似于 cron 的计划任务功能。
  4. 插件系统:通过插件扩展功能,比如日志记录、限流等。

总结

RoadRunner 是一个现代化的 PHP 应用服务器,特别适合高性能、高并发的场景。通过其长驻进程设计和 Go 语言的高效运行模式,它可以显著提高 PHP 应用的响应速度和吞吐量。

RoadRunner 的学习曲线可能稍陡,但一旦掌握,你的 PHP 应用将获得巨大的性能提升。希望本教程能帮助你快速上手 RoadRunner,利用其强大的功能构建高效的 PHP 服务!

标签: PHP, RoadRunner

添加新评论