zoukankan      html  css  js  c++  java
  • 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 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 .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 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

    参考: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

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

     
    QQ群 247823727 博客文件如果不能下载请进群下载
    如果公司项目有技术瓶颈问题,如有需要,请联系我,提供技术服务 QQ: 903464207
  • 相关阅读:
    WebService发布到IIS
    MongDb的安装
    Linux shell编程— 命令替换
    Linux软件包管理
    Linux 管理进程
    Linux 中进程的管理
    JavaScript学习day3 (基本语法下)
    JavaScript学习day2 (基本语法上)
    JavaScript学习day1
    Python 学习
  • 原文地址:https://www.cnblogs.com/zx-admin/p/14862341.html
Copyright © 2011-2022 走看看