简介
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 反对的列类型:string
,int
,和 float
。
翻译地址