spiral / roadrunner-laravel
Requires
- php: ^8.0
- composer-runtime-api: ^2.0
- laravel/framework: ~9.33 || ~10.0
- nyholm/psr7: ^1.5
- spiral/roadrunner-http: ^2.2 || ^3.0
- spiral/roadrunner-worker: ^2.2 || ^3.0
- symfony/psr-http-message-bridge: ^2.1
Requires (Dev)
- brick/math: ^0.10
- guzzlehttp/guzzle: ^6.3 || ~7.0
- inertiajs/inertia-laravel: ^0.6
- laravel/laravel: ~9.1 || ~10.0
- laravel/scout: ~9.0 || ~10.0
- laravel/socialite: ^5.0
- laravel/telescope: ^4.5
- livewire/livewire: ^2.7
- mockery/mockery: ^1.4.4
- phpstan/phpstan: ~1.6
- phpunit/phpunit: ^9.5.10
- tightenco/ziggy: ^1.4.0
README
RoadRunner ⇆ Laravel 桥接器
连接 RoadRunner 和 Laravel 应用程序的简单方式(社区集成)。
🐋 如果你想看一个在 Docker 容器中运行,以 RoadRunner 作为 Web 服务器的 Laravel 应用程序的示例 - 请查看 此存储库。
安装
请确保系统(或 Docker 镜像)上已安装 RR 二进制文件。使用以下命令通过 composer 安装此包
$ composer require spiral/roadrunner-laravel
需要安装
composer
(如何安装 composer)。
然后您可以使用以下命令“发布”包配置文件(./config/roadrunner.php
)
$ php ./artisan vendor:publish --provider='Spiral\RoadRunnerLaravel\ServiceProvider' --tag=config
重要:尽管工作进程允许您在每次 HTTP 请求时刷新应用程序实例 (如果工作进程以 --refresh-app
选项启动,例如:php ./vendor/bin/rr-worker start --refresh-app
),但我们强烈建议出于性能原因避免这样做。大型应用程序可能难以与 RoadRunner 集成 (您必须决定哪些服务提供者在每次请求时需要重新加载,在某些情况下避免“静态优化”),但这值得。
升级指南
v4.x → v5.x
- 更新应用程序中的当前包
composer remove spiral/roadrunner-laravel
composer require spiral/roadrunner-laravel "^5.0"
- 更新包配置文件(
roadrunner.php
;请查看当前存储库中的实际示例)
v3.x → v4.x
- 更新应用程序中的当前包
composer remove spiral/roadrunner-laravel
composer require spiral/roadrunner-laravel "^4.0"
- 更新您的
.rr.yaml
配置(请查看示例 此处) - 许多选项已更改- 可选:更改中继到套接字或 TCP 端口
server: command: "php ./vendor/bin/rr-worker start --relay-dsn unix:///var/run/rr-relay.sock" relay: "unix:///var/run/rr-relay.sock"
- 可选:更改中继到套接字或 TCP 端口
- 更新 RR 二进制文件(使用
roadrunner-cli
或从 二进制发布 页面下载)至v2.x
- 更新 RoadRunner 启动标志(
rr serve ...
) --v
和-d
不再使用 - 在您的应用程序代码中,将
Spiral\RoadRunner\PSR7Client
替换为Spiral\RoadRunner\Http\PSR7Worker
用法
安装包后,您可以使用提供的“二进制”文件作为 RoadRunner 工作进程:./vendor/bin/rr-worker
。此工作进程允许您使用 laravel 事件系统 与传入请求和传出响应进行交互。事件包含
简单的 .rr.yaml
配置示例(完整的示例可以在 此处 找到)
对于
windows
,路径必须是完整的(例如:php vendor/spiral/roadrunner-laravel/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端口 中继使用被强烈推荐,以避免与 dd()
、dump()
、echo()
等类似函数的问题,这些函数会将数据发送到IO管道。
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
或认证 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
变更日志
变更日志可以在这里找到。
支持
如果您发现任何软件包错误,请在当前存储库中创建问题。
许可证
MIT许可证(MIT)。有关更多信息,请参阅LICENSE
。由tarampampam和Spiral Scout维护。