pushrbx / lumen-roadrunner
在 RoadRunner 上运行的 Lumen 框架
Requires
- php: ^8.0
- composer-runtime-api: ^2.0
- laravel/lumen-framework: ^9.0
- nyholm/psr7: ^1.5
- spiral/roadrunner-http: ^2.0.4
- spiral/roadrunner-worker: ^2.1.5
- symfony/psr-http-message-bridge: ^2.0
Requires (Dev)
- guzzlehttp/guzzle: ^6.3 || ~7.0
- inertiajs/inertia-laravel: ^0.4.2 || ^0.5
- laravel/lumen: ^9.0
- livewire/livewire: ^2.7
- mockery/mockery: ~1.3.3 || ^1.4.2
- phpstan/phpstan: ~1.4
- phpunit/phpunit: ^9.3.3
- tightenco/ziggy: ^1.4.0
README
轻松连接 RoadRunner 和 Lumen 应用程序的简单方法。这是 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"]
Socket 或 TCP 端口 代理的使用强烈建议,以避免与发送数据到 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); // ... } }
中间件构造函数
您永远不应该使用中间件构造函数来解析和 存储 session
、session.store
、auth
或 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
变更日志
如果您发现任何包错误,请在该当前仓库中 创建一个问题。