简介

Laravel Octane通过应用功能强大的应用程序服务器(包含Swoole 和RoadRunner )为应用程序提供服务,从而加强了应用程序的性能。Octane疏导您的应用程序一次,将其保留在内存中,而后以超音速提供申请。
官网地址

装置

能够通过Composer软件包管理器装置Octane:

composer require laravel/octane

装置Octane之后,您能够执行octane:install Artisan命令,该命令会将Octane的配置文件装置到您的应用程序中:

php artisan octane:install

装置条件

  • PHP8+
  • laravel v.8.37+

RoadRunner

RoadRunner由应用Go构建的RoadRunner二进制文件提供能源。首次启动基于RoadRunner的Octane服务器时,Octane将为您下载并装置RoadRunner二进制文件。

RoadRunner Via Laravel Sail

RoadRunner具体应用能够查看原文。

Swoole装置

pecl install swoole

启动你的服务

能够通过octane:startArtisan命令启动Octane服务器。默认状况下,此命令将利用server应用程序octane配置文件的配置选项指定的服务器:
php artisan octane:start

设置利用HTTPS.配置

OCTANE_HTTPS=false

设置启动服务的容器

OCTANE_SERVER=swoole

利用代码热加载

php artisan octane:start --watch
  • 留神
    应用该命令之前,应该确保本地装置了Node 服务.您应该在您的project:library中装置Chokidar 文件监督库:
npm install --save-dev chokidar

您能够应用watch应用程序的config/octane.php配置文件中的配置选项来配置应监督的目录和文件。

指定worker过程数

默认状况下,Octane将为您的计算机提供的每个CPU内核启动一个应用程序申请工作程序。而后,这些工作程序将在进入您的应用程序时用于解决传入的HTTP申请。您能够--workers在调用octane:start命令时手动指定要应用该选项的工人数量:

php artisan octane:start --workers=4

如果应用的是Swoole应用程序服务器,则还能够指定要启动的“工作工作者”数量:

php artisan octane:start --workers=4 --task-workers=6

指定最大的申请数

php artisan octane:start --max-requests=250

服务重启

您能够应用以下octane:reload命令失常重启Octane服务器的应用程序工作程序。通常,应在部署后执行此操作,以便将新部署的代码加载到内存中并用于解决后续申请:
php artisan octane:reload

服务进行

您能够应用octane:stopArtisan命令进行Octane服务器:
php artisan octane:stop

查看服务状态

php artisan octane:status

Octane 依赖注入

因为Octane会一次疏导您的应用程序并在解决申请时将其保留在内存中,因而在构建应用程序时应留神一些注意事项。例如,您的应用程序服务提供商的registerand boot办法仅在申请启动程序最后启动时执行一次。在后续申请中,雷同的应用程序实例将被重用。

有鉴于此,在将应用程序服务容器或申请注入到任何对象的构造函数中时,应分外小心。这样,该对象可能具备旧版本的容器或后续申请中的申请。

Octane将主动解决重置申请之间的任何第一方框架状态。然而,Octane并不总是晓得如何重置应用程序创立的全局状态。因而,您应该理解如何以Octane敌对的形式构建应用程序。上面,咱们将探讨应用辛烷值时可能引起问题的最常见状况。

容器注入

通常,应防止将应用程序服务容器或HTTP申请实例注入其余对象的构造函数中。例如,以下绑定将整个应用程序服务容器注入到作为单例绑定的对象中:

use App\Service;/** * Register any application services. * * @return void */public function register(){    $this->app->singleton(Service::class, function ($app) {        return new Service($app);    });}

<p>
在此示例中,如果Service在应用程序启动过程中解析了该实例,则该容器将被注入到服务中,并且该Service实例将在后续申请中保留该容器。对于您的特定应用程序,这可能不是问题;然而,这可能导致容器意外失落在疏导周期前期或后续申请中增加的绑定。

解决办法是,您能够进行将绑定注册为单例,也能够将容器解析器闭包注入始终解析以后容器实例的服务中:</p>

use App\Service;use Illuminate\Container\Container;$this->app->bind(Service::class, function ($app) {    return new Service($app);});$this->app->singleton(Service::class, function () {    return new Service(fn () => Container::getInstance());});

全局app帮忙器和Container::getInstance()办法将始终返回应用程序容器的最新版本。

申请注入

通常,应防止将应用程序服务容器或HTTP申请实例注入其余对象的构造函数中。例如,以下绑定将整个申请实例注入到作为单例绑定的对象中:

use App\Service;/** * Register any application services. * * @return void */public function register(){    $this->app->singleton(Service::class, function ($app) {        return new Service($app['request']);    });}

在此示例中,如果Service在应用程序启动过程中解析了实例,则HTTP申请将被注入到服务中,并且该Service实例将在后续申请中保留雷同的申请。因而,所有标头,输出和查问字符串数据以及所有其余申请数据都将不正确。

解决办法是,您能够进行将绑定注册为单例,或者能够将申请解析程序闭包注入始终解析以后申请实例的服务中。或者,最举荐的办法只是在运行时将对象须要的特定申请信息传递给对象的办法之一:

use App\Service;$this->app->bind(Service::class, function ($app) {    return new Service($app['request']);});$this->app->singleton(Service::class, function ($app) {    return new Service(fn () => $app['request']);});// Or...$service->method($request->input('name'));

全局request帮忙程序将始终返回应用程序以后正在解决的申请,因而能够在您的应用程序中平安应用。

配置文件注入

通常,应防止将配置实例注入其余对象的构造函数中。例如,以下绑定将配置注入到作为单例绑定的对象中:
use App\Service;/** * Register any application services. * * @return void */public function register(){    $this->app->singleton(Service::class, function ($app) {        return new Service($app->make('config'));    });}

在此示例中,如果配置值在两次申请之间更改,则该服务将无法访问新值,因为它取决于原始存储库实例。

解决办法是,您能够进行将绑定注册为单例,或者能够将配置存储库解析器闭包注入到该类中:

use App\Service;use Illuminate\Container\Container;$this->app->bind(Service::class, function ($app) {    return new Service($app->make('config'));});$this->app->singleton(Service::class, function () {    return new Service(fn () => Container::getInstance()->make('config'));});
全局config将始终返回配置的最新版本,因而能够在您的应用程序中平安应用。

治理内存透露

请记住,Octane在两次申请之间将您的应用程序保留在内存中;因而,将数据增加到动态保护的阵列将导致内存透露。例如,因为对利用程>序的每个申请将持续向动态$data数组增加数据,因而以下控制器产生内存透露:
se App\Service;use Illuminate\Http\Request;use Illuminate\Support\Str;/** * Handle an incoming request. * * @param  \Illuminate\Http\Request  $request * @return void */public function index(Request $request){    Service::$data[] = Str::random(10);    // ...}

并发工作

  • 提醒该性能须要应用Swoole
应用Swoole时,您能够通过轻量级后台任务同时执行操作。您能够应用Octane:: tick concurrently办法实现此操作。您能够将此办法与PHP数组解>构相结合,以检索每个操作的后果:
use App\User;use App\Server;use Laravel\Octane\Facades\Octane;[$users, $servers] = Octane::concurrently([    fn () => User::all(),    fn () => Server::all(),]);
由Octane解决的并发工作利用Swoole的“task workers”,并在与传入申请齐全不同的过程中执行。可用于解决并发工作的工作者数量由--task-workers命令上的octane:start指令确定:
php artisan octane:start --workers=4 --task-workers=6

定时器 & 工夫距离

  • 提醒该性能须要应用Swoole

应用Swoole时,您能够注册将在每指定的秒数内执行的“tick”操作。您能够通过tick办法注册“ tick”回调。提供给该tick办法的第一个参数应该是代表股票行情指示器名称的字符串。第二个参数应该是可调用的,它将在指定的工夫距离被调用。

在此示例中,咱们将注册一个闭包,每10秒调用一次。通常,tick应在boot应用程序的服务提供者之一的办法内调用该办法:

Octane::tick('simple-ticker', fn () => ray('Ticking...'))       ->seconds(10);
应用该immediate办法,您能够批示Octane在Octane服务器最后启动时立刻调用tick回调,尔后每隔N秒:
Octane::tick('simple-ticker', fn () => ray('Ticking...'))        ->seconds(10)        ->immediate();

Octane 缓存

这性能依赖于[Swoole]()

应用Swoole时,您能够利用Octane缓存驱动程序,该驱动程序提供每秒高达200万次操作的读写速度。因而,对于须要从其缓存层实现极高读/写速度的应用程序而言,此缓存驱动程序是一个绝佳抉择。
该缓存驱动程序由Swoole表提供能源。缓存中存储的所有数据对服务器上的所有工作人员均可用。然而,重新启动服务器后,将刷新缓存的数据:

Cache::store('octane')->put('framework', 'Laravel', 30);

缓存距离

除了Laravel缓存零碎提供的典型办法外,Octane缓存驱动程序还具备基于距离的缓存。这些缓存将按指定的工夫距离主动刷新,并应应用boot您的应用程序的服务提供商之一的办法进行注册。例如,以下缓存将每五秒钟刷新一次:
use Illuminate\Support\Str;Cache::store('octane')->interval('random', function () {    return Str::random(10);}, seconds: 5)

过程间共享内存 (table)

应用Swoole时,您能够定义本人的任意Swoole表并与之交互。Swoole表提供了极高的性能吞吐量,并且服务器上的所有工作人员都能够拜访这些表中的数据。然而,重新启动服务器后,其中的数据将失落。

表应在tables应用程序的octane配置文件的配置数组中定义。曾经为您配置了一个示例表,该表最多容许1000行。能够通过在列类型之后指定列大小来配置字符串列的最大大小,如下所示:

'tables' => [    'example:1000' => [        'name' => 'string:1000',        'votes' => 'int',    ],],

要拜访表,能够应用以下Octane::table办法:

use Laravel\Octane\Facades\Octane;Octane::table('example')->set('uuid', [    'name' => 'Nuno Maduro',    'votes' => 1000,]);return Octane::table('example')->get('uuid');

通过Swoole table 反对的列类型:stringint,和 float

翻译地址