balidinof/roadrunner-bundle

作为 Symfony Bundle 的 RoadRunner 工作者

资助包维护!
Baldinof

安装次数: 747 975

依赖项: 2

建议者: 0

安全性: 0

星星: 266

关注者: 5

分支: 47

开放问题: 25

类型:symfony-bundle

3.1.2 2024-06-12 06:56 UTC

README

RoadRunner 是一个用 Golang 编写的性能高效的 PHP 应用服务器、负载均衡器和进程管理器。

此包提供集成的 RoadRunner Worker,易于配置和扩展。

安装

运行以下命令

composer require baldinof/roadrunner-bundle

如果您不使用 Symfony Flex

  • 在您的内核中注册 Baldinof\RoadRunnerBundle\BaldinofRoadRunnerBundle
  • 复制默认的 RoadRunner 配置文件:cp vendor/baldinof/roadrunner-bundle/.rr.* .

使用方法

  • 要求 RoadRunner 下载工具:composer require --dev spiral/roadrunner-cli
  • 获取 RoadRunner 二进制文件:vendor/bin/rr get --location bin/
  • 使用 bin/rr servebin/rr serve -c .rr.dev.yaml(监视模式)运行 RoadRunner
  • 访问您的应用程序:https://:8080

集成

根据安装的包和您的配置,此包添加了一些集成

  • Sentry:配置请求上下文(如果安装了 SentryBundle
  • 会话:将会话cookie添加到 Symfony 响应(如果 framework.sessions.enabled 配置为 true
  • Doctrine Mongo Bundle:在每个请求后清除打开的管理器(如果安装了 DoctrineMongoDBBundle
  • Doctrine ORM Bundle:在每个请求后清除打开的管理器并检查连接是否仍然可用(如果安装了 DoctrineBundle
  • Blackfire:在请求配置文件时启用探测(如果安装了 blackfire 扩展)

即使不建议,您也可以禁用默认集成

baldinof_road_runner:
  default_integrations: false

中间件

您可以使用中间件来操作请求和响应。中间件必须实现 Baldinof\RoadRunnerBundle\Http\MiddlewareInterface

示例配置

baldinof_road_runner:
    middlewares:
        - App\Middleware\YourMiddleware

请注意

  • 中间件在 Symfony Kernel::handle() 之外运行
  • 中间件栈总是在工作进程启动时解析(如果您的中间件初始化需要时间,可能会出现性能问题)

内核重启

Symfony 内核和依赖注入容器在请求之间是 保留的。如果在请求处理过程中抛出异常,则重启内核并使用新的容器。

目标是防止服务在错误后处于不可恢复的状态。

为了优化您的工作者,您可以允许不会使您的应用程序处于错误状态的异常

# config/packages/baldinof_road_runner.yaml
baldinof_road_runner:
    kernel_reboot:
      strategy: on_exception
      allowed_exceptions:
        - Symfony\Component\HttpKernel\Exception\HttpExceptionInterface
        - Symfony\Component\Serializer\Exception\ExceptionInterface
        - App\Exception\YourDomainException

如果您的某些服务是状态性的,您可以实现 Symfony\Contracts\Service\ResetInterface,并且您的服务将在每个请求上重置。

如果您在每次请求上都希望使用新的容器,则可以使用 always 重启策略

# config/packages/baldinof_road_runner.yaml
baldinof_road_runner:
    kernel_reboot:
      strategy: always

如果您正在构建需要每隔 XXX 请求重新启动一次以防止内存泄漏的长运行应用程序,则可以使用 max_jobs 重启策略

# config/packages/baldinof_road_runner.yaml
baldinof_road_runner:
    kernel_reboot:
      strategy: max_jobs
      max_jobs: 1000 # maximum number of request
      max_jobs_dispersion: 0.2 # dispersion 20% used to prevent simultaneous reboot of all active workers (kernel will rebooted between 800 and 1000 requests) 

您可以将重启策略组合起来

# config/packages/baldinof_road_runner.yaml
baldinof_road_runner:
    kernel_reboot:
      strategy: [on_exception, max_jobs]
      allowed_exceptions:
        - Symfony\Component\HttpKernel\Exception\HttpExceptionInterface
        - Symfony\Component\Serializer\Exception\ExceptionInterface
        - App\Exception\YourDomainException
      max_jobs: 1000
      max_jobs_dispersion: 0.2

事件

以下事件在整个工作进程生命周期中会被触发

  • Baldinof\RoadRunnerBundle\Event\WorkerStartEvent:在工作进程开始监听请求之前触发。
  • Baldinof\RoadRunnerBundle\Event\WorkerStopEvent:在工作进程关闭之前触发。
  • Baldinof\RoadRunnerBundle\Event\WorkerExceptionEvent:在请求处理期间遇到未捕获的异常后触发。
  • Baldinof\RoadRunnerBundle\Event\WorkerKernelRebootedEvent:在symfony内核重启后触发(参见内核重启)。

开发模式

如果不存在,请复制开发配置文件: cp vendor/baldinof/roadrunner-bundle/.rr.dev.yaml .

使用开发配置文件启动RoadRunner

bin/rr serve -c .rr.dev.yaml

参考: https://roadrunner.dev/docs/beep-beep-reload

如果您使用Symfony VarDumper,则不会在HTTP响应体中显示dump。您可以使用bin/console server:dump或性能分析器查看dump。

指标

Roadrunner可以收集应用指标,并暴露Prometheus端点。

示例配置

# config/packages/baldinof_road_runner.yaml
baldinof_road_runner:
  metrics:
    enabled: true
    collect:
      user_login:
        type: counter
        help: "Number of logged in user"

并配置RoadRunner

# .rr.yaml
rpc:
  listen: "tcp:127.0.0.1:6001"

metrics:
  address: "0.0.0.0:9180" # prometheus endpoint

然后简单地注入Spiral\RoadRunner\MetricsInterface来记录指标

class YouController
{
    public function index(MetricsInterface $metrics): Response
    {
        $metrics->add('user_login', 1);

        return new Response("...");
    }
}

gRPC

通过roadrunner-grpc插件为RoadRunner 2添加了gRPC支持(https://github.com/spiral/roadrunner-grpc)。

要配置Roadrunner以支持gRPC,请参考https://roadrunner.dev/docs/beep-beep-grpc中的配置参考。基本配置示例

server:
  command: "php public/index.php"
  env:
    APP_RUNTIME: Baldinof\RoadRunnerBundle\Runtime\Runtime

grpc:
  listen: "tcp://:9001"

  proto:
    - "calculator.proto"

一旦您从proto文件生成了PHP文件,您只需实现服务接口。gRPC服务会自动注册。示例服务

<?php

namespace App\Grpc;

use Spiral\RoadRunner\GRPC;
use App\Grpc\Generated\Calculator\Sum;
use App\Grpc\Generated\Calculator\Result;
use App\Grpc\Generated\Calculator\CalculatorInterface;

class Calculator implements CalculatorInterface
{
    public function Sum(GRPC\ContextInterface $ctx, Sum $in): Result
    {
        return (new Result())->setResult($in->getA() + $in->getB());
    }
}

KV缓存

Roadrunner有一个KV(键值)插件,可用于在请求之间缓存数据。

要使用它,请参考https://roadrunner.dev/docs/kv-overview中的配置参考。这需要spiral/roadrunner-kvspiral/goridgesymfony/cache的Composer依赖项。基本配置示例

示例配置

# config/packages/baldinof_road_runner.yaml
baldinof_road_runner:
  kv:
    storages:
      - example

并配置RoadRunner

# .rr.yaml
rpc:
  listen: tcp://127.0.0.1:6001

kv:
  example:
    driver: memory
    config: { }

现在将为您的存储自动创建一个适配器服务,名称为cache.adapter.roadrunner.kv_<YOUR_STORAGE_NAME>

基本使用示例

# config/packages/cache.yaml
framework:
  cache:
    pools:
      cache.example:
        adapter: cache.adapter.roadrunner.kv_example

Docker中的使用

# Dockerfile
FROM php:8.1-alpine

RUN apk add --no-cache linux-headers autoconf openssl-dev g++ make pcre-dev icu-dev zlib-dev libzip-dev && \
    docker-php-ext-install bcmath intl opcache zip sockets && \
    apk del --purge autoconf g++ make

WORKDIR /usr/src/app

COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

COPY composer.json composer.lock ./

RUN composer install --no-dev --no-scripts --prefer-dist --no-progress --no-interaction

RUN ./vendor/bin/rr get-binary --location /usr/local/bin

COPY . .

ENV APP_ENV=prod

RUN composer dump-autoload --optimize && \
    composer check-platform-reqs && \
    php bin/console cache:warmup

EXPOSE 8080

CMD ["rr", "serve"]