avto-dev / roadrunner-laravel
Requires
- php: ^7.1.3
- ext-mbstring: *
- illuminate/contracts: ^5.5 || ~6.0 || ~7.0
- illuminate/http: ^5.5 || ~6.0 || ~7.0
- illuminate/routing: ^5.5 || ~6.0 || ~7.0
- illuminate/support: ^5.5 || ~6.0 || ~7.0
- laminas/laminas-diactoros: ^2
- spiral/roadrunner: ~1.7
- symfony/psr-http-message-bridge: ^1.2 || ^2.0
Requires (Dev)
- ext-pdo: *
- ext-pdo_sqlite: *
- ext-sqlite3: *
- laravel/laravel: ^5.5 || ~6.0 || ~7.0
- mockery/mockery: ^1.3
- phpstan/phpstan: ~0.12
- phpunit/phpunit: ^6.4 || ~7.5
Suggests
- avto-dev/stacked-dumper-laravel: Stacked variables dumper for Laravel-based application
- illuminate/database: Required for dropping database connections
- illuminate/redis: Required for dropping redis connections
README
此包已被弃用且不再维护
建议使用 spiral/roadrunner-laravel 包
RoadRunner ⇆ Laravel 桥接器
轻松连接 RoadRunner 和 Laravel 应用程序的方法。
安装
使用以下命令使用 composer 安装此包
$ composer require avto-dev/roadrunner-laravel "^3.3"
需要安装
composer
(如何安装 composer)。
您需要修复包的主版本。
之前的主版本仍然可用,但其开发已被弃用。仅使用最新主版本!
之后,您可以使用以下命令“发布”包配置文件(./config/roadrunner.php
)
$ php ./artisan vendor:publish --provider='AvtoDev\RoadRunnerLaravel\ServiceProvider' --tag=config
和基本的 RoadRunner 配置文件(./.rr.yaml.dist
)
$ php ./artisan vendor:publish --provider='AvtoDev\RoadRunnerLaravel\ServiceProvider' --tag=rr-config
之后,您可以按需修改配置文件。
重要:尽管工作进程允许您在每次 HTTP 请求时刷新应用程序实例(如果环境变量 APP_REFRESH
设置为 true
),但我们强烈建议出于性能原因避免此操作。大型应用程序可能难以与 RoadRunner 集成(您必须决定哪些服务提供商必须在每次请求时重新加载,避免在某些情况下的“静态优化”),但这是值得的。
使用方法
包安装后,您可以使用提供的“二进制”文件作为 RoadRunner 工作进程:./vendor/bin/rr-worker
。此工作进程允许您使用 laravel 事件系统 与传入请求和传出响应进行交互。事件还包含
事件类名 | 应用程序对象 | HTTP 服务器请求 | HTTP 请求 | HTTP 响应 | 异常 |
---|---|---|---|---|---|
BeforeLoopStartedEvent |
✔ | ||||
BeforeLoopIterationEvent |
✔ | ✔ | |||
BeforeRequestHandlingEvent |
✔ | ✔ | |||
AfterRequestHandlingEvent |
✔ | ✔ | ✔ | ||
AfterLoopIterationEvent |
✔ | ✔ | ✔ | ||
AfterLoopStoppedEvent |
✔ | ||||
LoopErrorOccurredEvent |
✔ | ✔ | ✔ |
简单的 .rr.yaml
配置示例
env: #APP_REFRESH: true http: address: 0.0.0.0:8080 workers: command: 'php ./vendor/bin/rr-worker' static: dir: 'public'
Roadrunner 服务器启动
$ rr -c ./.rr.yaml serve -d
监听器
此包提供事件监听器,用于在不完全重新加载应用程序的情况下重置应用程序状态(例如cookie、HTTP请求、应用程序实例、服务提供商等)。其中一些已在配置文件中声明,但您也可以无限制地声明自己的。
环境变量
您可以使用以下环境变量
变量名称 | 描述 |
---|---|
APP_FORCE_HTTPS |
(在配置文件中声明) 强制应用程序使用HTTPS方案 |
APP_REFRESH |
每次请求都刷新应用程序实例 |
已知问题
控制器构造函数
您应该避免使用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许可证许可。