本文目录导读:

- 什么是 RoadRunner
- 安装 RoadRunner
- 创建配置文件
.rr.yaml - 创建入口文件
worker.php - 集成框架示例
- 启动 RoadRunner
- 高级配置示例
- 性能优化建议
- 监控和调试
- 常见问题解决
我将详细介绍如何在 PHP 项目中使用 RoadRunner,这是一个高性能的 PHP 应用服务器。
什么是 RoadRunner
RoadRunner 是一个基于 Go 语言编写的高性能 PHP 应用服务器,它通过保持 PHP 进程常驻内存来大幅提升性能。
安装 RoadRunner
使用 Composer 安装
# 创建项目 composer create-project spiral/roadrunner-demo my-app # 或添加到现有项目 composer require spiral/roadrunner
下载二进制文件
# 使用 Composer 脚本下载 composer require spiral/roadrunner-cli ./vendor/bin/rr get # 或直接下载 wget https://github.com/spiral/roadrunner/releases/download/v2.12.0/roadrunner-2.12.0-linux-amd64.tar.gz tar -xzf roadrunner-2.12.0-linux-amd64.tar.gz
创建配置文件 .rr.yaml
version: "2.7"
# HTTP 服务器配置
http:
address: "0.0.0.0:8080"
middleware:
- gzip
- static
- headers
static:
dir: "public"
forbid:
- ".php"
pool:
num_workers: 10
max_jobs: 1000
allocate_timeout: 60s
destroy_timeout: 60s
# 日志配置
logs:
mode: production
level: info
output: stderr
# 服务配置
service:
# 用于监控
metrics:
listen: "tcp://0.0.0.0:2112"
# 核心配置
rpc:
listen: "tcp://127.0.0.1:6001"
创建入口文件 worker.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Spiral\RoadRunner;
use Nyholm\Psr7\Factory\Psr17Factory;
use Nyholm\Psr7\Response;
use Nyholm\Psr7\ServerRequest;
use Spiral\RoadRunner\Http\PSR7Worker;
// 创建 PSR-7 工厂
$factory = new Psr17Factory();
// 创建 PSR-7 Worker
$worker = new PSR7Worker(
RoadRunner\Worker::create(),
$factory,
$factory,
$factory
);
// 主循环
while ($req = $worker->waitRequest()) {
try {
// 处理请求
$r = $req->getMethod() . ' ' . $req->getUri() . '<br>';
// 创建响应
$response = new Response(
200,
['Content-Type' => 'text/html'],
'Hello RoadRunner!<br>' . $r
);
// 发送响应
$worker->respond($response);
} catch (\Throwable $e) {
$worker->getWorker()->error($e->getMessage());
}
}
集成框架示例
Laravel 集成
# 安装 laravel 桥接包 composer require spiral/roadrunner-laravel
配置 laravel-worker.php:
<?php
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/bootstrap/app.php';
use Spiral\RoadRunner\Laravel\ServiceProvider;
use Illuminate\Http\Request;
// 启动 Laravel 应用
$app = require_once __DIR__ . '/bootstrap/app.php';
$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap();
use Spiral\RoadRunner;
use Spiral\RoadRunner\Http\PSR7Worker;
$worker = RoadRunner\Worker::create();
$psr7Worker = new PSR7Worker(
$worker,
new \Nyholm\Psr7\Factory\Psr17Factory(),
new \Nyholm\Psr7\Factory\Psr17Factory(),
new \Nyholm\Psr7\Factory\Psr17Factory()
);
while ($req = $psr7Worker->waitRequest()) {
try {
// 转换为 Laravel 请求
$request = \Spiral\RoadRunner\Laravel\Adaption::adaptRequest($req);
// 处理请求
$response = $app->handle($request);
// 转换为 PSR-7 响应
$psr7Response = \Spiral\RoadRunner\Laravel\Adaption::adaptResponse($response);
// 发送响应
$psr7Worker->respond($psr7Response);
} catch (\Throwable $e) {
$psr7Worker->getWorker()->error($e->getMessage());
}
}
Symfony 集成
<?php
require __DIR__ . '/vendor/autoload.php';
use Spiral\RoadRunner;
use Spiral\RoadRunner\Http\PSR7Worker;
use Nyholm\Psr7\Factory\Psr17Factory;
use Symfony\Bridge\PsrHttpMessage\Factory\PsrHttpFactory;
use Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory;
// 创建 PSR-7 Worker
$worker = new PSR7Worker(
RoadRunner\Worker::create(),
new Psr17Factory(),
new Psr17Factory(),
new Psr17Factory()
);
// 创建 Symfony 应用
$kernel = new AppKernel('prod', false);
while ($req = $worker->waitRequest()) {
try {
// 转换请求
$symfonyRequest = (new HttpFoundationFactory())->createRequest($req);
// 处理请求
$symfonyResponse = $kernel->handle($symfonyRequest);
// 转换响应
$psr7Response = (new PsrHttpFactory(
new Psr17Factory(),
new Psr17Factory(),
new Psr17Factory(),
new Psr17Factory()
))->createResponse($symfonyResponse);
// 发送响应
$worker->respond($psr7Response);
} catch (\Throwable $e) {
$worker->getWorker()->error($e->getMessage());
}
}
启动 RoadRunner
# 开发模式 ./rr serve -v -d # 生产模式 ./rr serve -c .rr.yaml # 热重载 ./rr serve -w # 重置 workers ./rr reset # 查看状态 ./rr status
高级配置示例
version: "2.7"
http:
address: "0.0.0.0:8080"
middleware:
- gzip
- static
- headers
- cors
pool:
num_workers: 50
max_jobs: 1000
allocate_timeout: 60s
destroy_timeout: 60s
supervisor:
watch_tick: 10s
ttl: 3600s
idle_ttl: 300s
# WebSocket 配置
websocket:
broker:
address: "tcp://127.0.0.1:6002"
# gRPC 配置
grpc:
listen: "tcp://0.0.0.0:9001"
proto:
- "proto/helloworld.proto"
# 数据库连接池
pool:
num_workers: 10
# 缓存配置
cache:
type: "in-memory"
性能优化建议
# 生产环境优化配置
http:
pool:
num_workers: 100
max_jobs: 2000
allocate_timeout: 120s
destroy_timeout: 120s
supervisor:
watch_tick: 1s
max_worker_memory: 256
# 启用 HTTP/2
http:
ssl:
address: "0.0.0.0:443"
redirect: true
cert: "/etc/ssl/certs/server.crt"
key: "/etc/ssl/private/server.key"
监控和调试
# 查看 metrics curl http://localhost:2112/metrics # 重置所有 workers ./rr reset # 查看 worker 状态 ./rr jobs:list
常见问题解决
内存泄漏
// 在 worker.php 中定期重启
if (memory_get_usage(true) > 256 * 1024 * 1024) {
// 重置或退出 worker
exit(0);
}
热重载配置
http:
pool:
supervisor:
watch_tick: 10s
ttl: 3600s
idle_ttl: 300s
RoadRunner 的核心优势:
- 🚀 高性能:常驻内存,避免每次请求都创建进程
- 🔄 热重载:快速部署和更新代码
- 📊 可监控:内置 metrics 和日志功能
- 🔌 协议支持:HTTP、gRPC、WebSocket 等
使用 RoadRunner 可以显著提升 PHP 应用的性能和稳定性,特别是在高并发场景下。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播