pushrbx/lumen-roadrunner

在 RoadRunner 上运行的 Lumen 框架

v5.9.1 2023-02-12 14:34 UTC

README

轻松连接 RoadRunnerLumen 应用程序的简单方法。这是 spiral/roadrunner-laravel 的分支,使其能够与 lumen 一起工作,而不是完整的 Laravel 框架。

请注意,此库尚未准备好用于生产,仍在开发中。

安装

请确保您的系统(或 Docker 镜像)上已经安装了 RR 二进制文件。使用以下命令通过 composer 安装此包:

$ composer require pushrbx/lumen-roadrunner

需要安装 composer(《如何安装 composer》)。

之后,您可以使用以下命令“发布”包配置文件(./config/roadrunner.php):

$ php ./artisan vendor:publish --provider='pushrbx\LumenRoadRunner\ServiceProvider' --tag=config

重要:尽管工作进程允许您在每次 HTTP 请求时刷新应用程序实例(如果工作进程以 --refresh-app 选项启动,例如:php ./vendor/bin/rr-worker start --refresh-app),但我们强烈建议出于性能原因避免这样做。大型应用程序可能难以与 RoadRunner 集成(您必须决定哪些服务提供商必须在每次请求中重新加载,避免在某些情况下进行“静态优化”),但这值得。

用法

包安装后,您可以使用提供的“二进制”文件作为 RoadRunner 工作进程:./vendor/bin/rr-worker。此工作进程允许您使用 laravel 事件系统与传入的请求和传出的响应进行交互。事件包含

简单的 .rr.yaml 配置示例(完整的示例可以在这里找到

对于 windows,路径必须是完整的(例如:php vendor/pushrbx/lumen-roadrunner/bin/rr-worker start

version: "2.7"

server:
  command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///var/run/rr-relay.sock"
  relay: "unix:///var/run/rr-relay.sock"

http:
  address: 0.0.0.0:8080
  middleware: ["static", "headers", "gzip"]
  pool:
    max_jobs: 64 # feel free to change this
    supervisor:
      exec_ttl: 60s
  headers:
    response:
      X-Powered-By: "RoadRunner"
  static:
    dir: "public"
    forbid: [".php"]

SocketTCP 端口 代理的使用强烈建议,以避免与发送数据到 IO 管道的 dd()dump()echo() 和其他类似函数的问题。

Roadrunner 服务器启动

$ rr serve -c ./.rr.yaml

监听器

此包提供事件监听器,以在不完全重新加载应用程序的情况下重置应用程序状态(例如 cookies、HTTP 请求、应用程序实例、服务提供商等)。其中一些已在配置文件中声明,但您也可以声明自己的,没有任何限制。

助手

此包提供以下助手

已知问题

性能下降

...当您的会话设置为 file 驱动程序时。请改用 redis(或类似)驱动程序(相关问题)。此包或/和 RoadRunner 与此无关,但鉴于这是一个相当普遍的问题 - 因此在此进行了描述。

控制器构造函数

您应该避免使用 HTTP 控制器构造函数(在构造函数中创建或解析的实例可以在不同的请求之间共享) 。请使用控制器 方法 中的依赖关系解析。

不好

<?php

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * The user repository instance.
     */
    protected $users;

    /**
     * @var Request
     */
    protected $request;

    /**
     * @param UserRepository $users
     * @param Request        $request
     */
    public function __construct(UserRepository $users, Request $request)
    {
        $this->users   = $users;
        $this->request = $request;
    }

    /**
     * @return Response
     */
    public function store(): Response
    {
        $user = $this->users->getById($this->request->id);

        // ...
    }
}

<?php

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * @param  Request        $request
     * @param  UserRepository $users
     *
     * @return Response
     */
    public function store(Request $request, UserRepository $users): Response
    {
        $user = $users->getById($request->id);

        // ...
    }
}

中间件构造函数

您永远不应该使用中间件构造函数来解析和 存储 sessionsession.storeauth 或 auth Guard 实例(例如)。请使用方法注入或通过 Request 实例访问它们。

不好

<?php

use Illuminate\Http\Request;
use Illuminate\Session\Store;

class Middleware
{
    /**
     * @var Store
     */
    protected $session;

    /**
     * @param Store $session
     */
    public function __construct(Store $session)
    {
        $this->session = $session;
    }

    /**
     * Handle an incoming request.
     *
     * @param Request  $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $name = $this->session->getName();

        // ...

        return $next($request);
    }
}

<?php

use Illuminate\Http\Request;

class Middleware
{
    /**
     * Handle an incoming request.
     *
     * @param Request  $request
     * @param \Closure $next
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next)
    {
        $name = $request->session()->getName();
        // $name = resolve('session')->getName();

        // ...

        return $next($request);
    }
}

测试

对于包测试,我们使用 phpunit 框架和 docker-ce + docker-compose 作为开发环境。因此,在克隆仓库后,只需在您的终端中写入以下命令

$ make build
$ make latest # or 'make lowest'
$ make test

变更日志

Release date Commits since latest release

如果您发现任何包错误,请在该当前仓库中 创建一个问题

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 LICENSE。由 pushrbx 维护。