2021年6月8日12:51:06
golang roadrunner中文文档(一)基础介绍
golang roadrunner中文文档(二)PHP Workers
golang roadrunner中文文档(三)HTTPS 和 HTTP/2
golang roadrunner中文文档(四)app服务器
golang roadrunner中文文档(五)集成到其他服务 docker
Workers
为了运行您的 PHP 应用程序,您必须创建一个工作端点并配置 RoadRunner 以使用它。首先,使用Composer安装所需的包。
composer require spiral/roadrunner nyholm/psr7
使用 PSR-7 服务器 API 的最简单入口点可能如下所示:
<?php
use SpiralRoadRunner;
use NyholmPsr7;
include "vendor/autoload.php";
$worker = RoadRunnerWorker::create();
$psrFactory = new Psr7FactoryPsr17Factory();
$worker = new RoadRunnerHttpPSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory);
while ($req = $worker->waitRequest()) {
try {
$rsp = new Psr7Response();
$rsp->getBody()->write('Hello world!');
$worker->respond($rsp);
} catch (Throwable $e) {
$worker->getWorker()->error((string)$e);
}
}
这样Workers将期望通过标准管道与父 RoadRunner 服务器进行通信,创建.rr.yaml
配置以启用它:
server:
command: "php psr-worker.php"
http:
address: 0.0.0.0:8080
pool:
num_workers: 4
如果您不喜欢yaml
尝试.rr.json
:
{
"server": {
"command": "path-to-php/php psr-worker.php"
},
"http": {
"address": "0.0.0.0:8080",
"pool": {
"num_workers": 4
}
}
}
您现在可以通过下载 RR 二进制文件并运行来启动应用程序 rr serve
替代沟通方式
PHP Workers 将利用标准管道 STDOUT 和 STDERR 与 RR 服务器交换数据帧。在某些情况下,您可能希望使用替代通信方法,例如 TCP 套接字:
server:
command: "php psr-worker.php"
relay: "tcp://localhost:7000"
http:
address: 0.0.0.0:8080
pool:
num_workers: 4
Unix 套接字:
server:
command: "php psr-worker.php"
relay: "unix://rr.sock"
http:
address: 0.0.0.0:8080
pool:
num_workers: 4
故障排除
在某些情况下,RR 将无法处理 PHP worker 产生的错误(PHP 丢失、脚本死机等)。
$ rr serve
DEBU[0003] [rpc]: started
DEBU[0003] [http]: started
ERRO[0003] [http]: unable to connect to worker: unexpected response, header is missing: exit status 1
DEBU[0003] [rpc]: stopped
您可以通过手动调用command
set in .rr
file来解决它:
$ php psr-worker.php
在提供任何输入之前,工作人员不应导致任何错误,并且必须在第一个输入字符后以无效输入签名失败。
其他类型的Workers
不同的roadrunner 实现可能会定义自己的worker API,例如:GRPC、Workflow/Activity Worker。
环境配置
所有 RoadRunner 工作人员都将继承可用于父服务器进程的系统配置。此外,你可以自定义设置ENV变量传递到使用部分你的工人env
的.rr
配置文件。
server:
command: "php worker.php"
env:
key: value
所有键都将自动大写!
默认 ENV 值
RoadRunner 提供了一组 ENV 值来帮助 PHP 进程识别如何与服务器正确通信。
钥匙 | 描述 |
---|---|
RR_MODE | 确定工作模式应该使用的模式(“http”,“temporal”) |
RR_RPC | 启用时包含 RPC 连接地址。 |
RR_RELAY | “管道”或“tcp://...”,取决于服务器中继配置。 |
开发者模式
RoadRunner 在守护进程模式下使用 PHP 脚本,这意味着每次更改代码库时都必须重新加载服务器。
如果您使用任何现代 IDE,您可以通过添加文件观察器来实现这一点,该观察器自动rr reset
为reload
配置中指定的插件调用命令。
或者使用自动复位器。
在 Docker 中
您可以通过使用本地 rr 客户端连接到 docker 来重置 rr 进程。
rpc:
listen: tcp://:6001
确保转发/公开端口 6001。
然后在rr reset
本地运行文件更改。
调试模式
在调试模式下运行工作程序(类似于 PHP-FPM 的操作方式):
http:
pool.debug: true
错误处理
有多种方法可以处理 PHP 工作人员产生的错误。
最简单和最常见的方法是使用以下错误消息响应父服务getWorker()->error()
:
try {
$resp = new endDiactorosResponse();
$resp->getBody()->write("hello world");
$psr7->respond($resp);
} catch (Throwable $e) {
$psr7->getWorker()->error((string)$e);
}
您还可以刷新警告和错误,STDERR
以将它们直接输出到控制台(类似于 docker-compose)。
file_put_contents('php://stderr', 'my message');
自 RoadRunner 2.0 起,所有发送到 STDOUT 的警告也将转发到 STDERR。
重新启动Workers
RoadRunner 提供了多种方法来按需安全地重新启动Workers。这两种方法都可以在实时服务器上使用,并且不会导致停机。
停止命令
您可以将stop
命令从工人发送到父服务器以强制进程销毁。在这种情况下,作业/请求将自动转发给下一个工作人员。
我们可以通过max_jobs
在PHP端实现控制来演示:
<?php
use SpiralRoadRunner;
use NyholmPsr7;
include "vendor/autoload.php";
$worker = RoadRunnerWorker::create();
$psrFactory = new Psr7FactoryPsr17Factory();
$worker = new RoadRunnerHttpPSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory);
$count = 0;
while ($req = $worker->waitRequest()) {
try {
$rsp = new Psr7Response();
$rsp->getBody()->write('Hello world!');
$count++;
if ($count > 10) {
$worker->getWorker()->stop();
return;
}
$worker->respond($rsp);
} catch (Throwable $e) {
$worker->getWorker()->error((string)$e);
}
}
这种方法可用于控制 PHP 脚本内的内存使用。
完全重置
您还可以使用嵌入式RPC 总线启动所有 RoadRunner 工作器的重建:
$rpc = SpiralGoridgeRPCRPC::create('tcp://127.0.0.1:6001');
$rpc->call('resetter.Reset', 'http');
嵌入式监控
RoadRunner 能够监控您的应用程序并在必要时运行软重置(在请求之间)。以前的名字 - limit
,现在的 -supervisor
配置
编辑您的.rr
文件以指定应用程序的限制:
# monitors rr server(s)
http:
address: "0.0.0.0:8080"
pool:
num_workers: 6
supervisor:
# watch_tick defines how often to check the state of the workers (seconds)
watch_tick: 1s
# ttl defines maximum time worker is allowed to live (seconds)
ttl: 0
# idle_ttl defines maximum duration worker can spend in idle mode after first use. Disabled when 0 (seconds)
idle_ttl: 10s
# exec_ttl defines maximum lifetime per job (seconds)
exec_ttl: 10s
# max_worker_memory limits memory usage per worker (MB)
max_worker_memory: 100
RPC 到应用服务器
您可以通过SocketRelay
以下方式连接到应用服务器:
$rpc = SpiralGoridgeRPCRPC::create('tcp://127.0.0.1:6001');
您可以立即使用此 RPC 调用嵌入式 RPC 服务,例如 HTTP:
var_dump($rpc->call('informer.Workers', 'http'));
请注意,在调试模式(
http: { debug: true }
in.rr.yaml
)下运行工作人员的情况下,http工作人员的数量将为零([]
即将返回一个空数组)。此行为将来可能会更改,您不应依赖此结果来检查 RoadRunner 是否以开发模式启动。
您可以在本节中阅读如何创建自己的服务和 RPC 方法。
注意事项
上传文件
由于文件上传是在 RR 端处理的,所以 PHP 进程只会接收临时资源的文件名。此资源不会在uploaded files
哈希中注册,因此,函数is_uploaded_file
将始终返回false
。
退出和模具功能
请注意,你不应该使用下列任何一种方法的die
,exit
。如果您的库需要将内容写入标准输出,请使用缓冲输出。
缓存
在带有 WinCache 扩展的 Windows 上使用 roadrunner 可能会导致工作字节码卡在内存中。
调试
您可以将 RoadRunner 脚本与 xDebug 扩展一起使用。为了启用配置您的 IDE 以接受远程连接。
请注意,如果您运行多个 PHP 进程,您必须将允许的最大连接数扩展到活动工作器的数量,否则某些调用将不会在您的断点上被捕获。
要激活 xDebug,请确保xdebug.mode=debug
在您的php.ini
.
要在您的应用程序中启用 xDebug,请确保设置 ENV 变量XDEBUG_SESSION
:
rpc:
listen: tcp://127.0.0.1:6001
server:
command: "php worker.php"
env:
XDEBUG_SESSION: 1
http:
address: "0.0.0.0:8080"
pool:
num_workers: 1
debug: true
此时您应该能够使用断点和查看状态。