golang roadrunner中文文档(二)PHP Workers

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 Spiral\RoadRunner;
use Nyholm\Psr7;

include "vendor/autoload.php";

$worker = RoadRunner\Worker::create();
$psrFactory = new Psr7\Factory\Psr17Factory();

$worker = new RoadRunner\Http\PSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory);

while ($req = $worker->waitRequest()) {
    try {
        $rsp = new Psr7\Response();
        $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 .rrfile来解决它

$ php psr-worker.php

在提供任何输入之前,工作人员不应导致任何错误,并且必须在第一个输入字符后以无效输入签名失败。

其他类型的Workers

不同的roadrunner 实现可能会定义自己的worker API,例如:GRPCWorkflow/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 resetreload配置中指定的插件调用命令

或者使用自动复位器

在 Docker 中

您可以通过使用本地 rr 客户端连接到 docker 来重置 rr 进程。

rpc:
  listen: tcp://:6001

确保转发/公开端口 6001。

然后在rr reset本地运行文件更改。

调试模式

在调试模式下运行工作程序(类似于 PHP-FPM 的操作方式):

http:
  pool.debug: true


错误处理

有多种方法可以处理 PHP 工作人员产生的错误。

最简单和最常见的方法是使用以下错误消息响应父服务getWorker()->error()

try {
    $resp = new \Zend\Diactoros\Response();
    $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 Spiral\RoadRunner;
use Nyholm\Psr7;

include "vendor/autoload.php";

$worker = RoadRunner\Worker::create();
$psrFactory = new Psr7\Factory\Psr17Factory();

$worker = new RoadRunner\Http\PSR7Worker($worker, $psrFactory, $psrFactory, $psrFactory);

$count = 0;
while ($req = $worker->waitRequest()) {
    try {
        $rsp = new Psr7\Response();
        $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 = \Spiral\Goridge\RPC\RPC::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 = \Spiral\Goridge\RPC\RPC::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

参考:https : //github.com/spiral/roadrunner/issues/133

退出和模具功能

请注意,你不应该使用下列任何一种方法的dieexit如果您的库需要将内容写入标准输出,请使用缓冲输出。

缓存

在带有 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

此时您应该能够使用断点和查看状态。

 

posted on 2021-06-08 12:55  zh7314  阅读(468)  评论(0编辑  收藏  举报