balidinof / roadrunner-bundle
作为 Symfony Bundle 的 RoadRunner 工作者
Requires
- php: >=8.1
- psr/log: ^1.1 || ^2.0 || ^3.0
- spiral/goridge: ^4.0
- spiral/roadrunner: ^2023.1.0 || ^2024.1.0
- spiral/roadrunner-http: ^3.0
- spiral/roadrunner-worker: ^3.0.0
- symfony/config: ^6.0 || ^7.0
- symfony/dependency-injection: ^6.0 || ^7.0
- symfony/http-kernel: ^6.0 || ^7.0
- symfony/yaml: ^6.0 || ^7.0
Requires (Dev)
- blackfire/php-sdk: ^1.21
- doctrine/doctrine-bundle: ^2.1.1
- doctrine/mongodb-odm: ^2.2
- doctrine/orm: ^2.7.3
- laminas/laminas-zendframework-bridge: ^1.4
- mikey179/vfsstream: ^1.6.8
- nyholm/psr7: ^1.2
- sentry/sentry-symfony: ^4.5 || ^5.0
- spiral/roadrunner-grpc: ^3.0.0
- spiral/roadrunner-kv: ^4.0
- spiral/roadrunner-metrics: ^3.0.0
- symfony/framework-bundle: ^6.0 || ^7.0
- symfony/proxy-manager-bridge: ^6.0 || ^7.0
- symfony/runtime: ^6.0 || ^7.0
- symfony/validator: ^6.0 || ^7.0
- symfony/var-dumper: ^6.0 || ^7.0
- symfony/var-exporter: ^6.0 || ^7.0
Suggests
- nyholm/psr7: For a super lightweight PSR-7/17 implementation
- spiral/roadrunner-cli: For easy installation of RoadRunner
- symfony/proxy-manager-bridge: For doctrine re-connection implementation
Conflicts
- doctrine/doctrine-bundle: <2.1.1
- sentry/sentry-symfony: <4.5.0
- spiral/roadrunner-metrics: <3.0.0
- 3.x-dev
- 3.1.2
- 3.1.1
- 3.1.0
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.x-dev
- 2.3.2
- 2.3.1
- 2.3.0
- 2.2.4
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.2
- 2.0.1
- 2.0.0
- 2.0.0-BETA
- 1.x-dev
- 1.5.3
- 1.5.2
- 1.5.1
- 1.5.0
- 1.4.0
- 1.3.3
- 1.3.2
- 1.3.1
- 1.3.0
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1.0
- 1.0.2
- 1.0.1
- 1.0.0
- 0.1
- dev-session-middleware
- dev-custom_reboot_strategy
This package is auto-updated.
Last update: 2024-09-21 07:51:39 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 serve
或bin/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-kv
、spiral/goridge
和symfony/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"]