이 블로그 게시물에서는 Laravel Octane에 대해 살펴보고 이것이 무엇인지, 설치 및 사용 방법과 필요한 이유를 알려드리겠습니다. [추천 학습:
laravel 튜토리얼nginx와 같은 웹 서버를 통해 제공되는 기존 PHP 애플리케이션의 경우 들어오는 각 요청은 PHP-FPM 작업자를 생성합니다. 즉, 각 요청은 해당 요청을 처리하기 위해 필요한 모든 작업을 실행하는 별도의 PHP 프로세스를 시작합니다.
Laravel의 경우 이는 프레임워크가 시작되어야 하고, 모든 서비스 제공자가 컨테이너에 서비스를 등록하고, 모든 제공자가 스스로 시작하고, 요청이 미들웨어 클래스 목록을 거쳐 컨트롤러를 누르고, 뷰를 렌더링해야 함을 의미합니다. 등. . 마침내 서버로부터 응답을 받을 때까지 말이죠.
Swoole 또는 RoadRunner를 사용하면 들어오는 각 HTTP 요청에 대해 여전히 작업자 스레드가 있지만 모두 동일한 부트스트래핑 프레임워크를 공유합니다. 즉, 처음으로 들어오는 요청만 프레임워크를 부트스트랩합니다(모든 서비스 제공자 등 포함). 다른 모든 요청은 이미 만들어진 프레임워크를 사용할 수 있습니다. 이것이 바로 옥테인이 그렇게 빠른 이유입니다.
composer require laravel/octane
애플리케이션에 Octane을 설치한 후 php artisan octane:install
을 실행하세요. 그러면 Octane의 구성 파일이 게시되고 rr
- RoadRunner 바이너리가 .gitignore
파일에 추가됩니다.
제가 말했듯이 Octane은 다음과 같이 구성 파일을 게시합니다: php artisan octane:install
。这将发布 Octane 的配置文件,并将 rr
- RoadRunner 二进制文件添加到 .gitignore
文件中。
正如我所说,Octane 将发布其配置文件,如下所示:
return [ /* |-------------------------------------------------------------------------- | Octane 服务器 |-------------------------------------------------------------------------- | | 该值决定了 Octane 在通过 CLI 启动、 | 重启或停止服务器时将使用的默认 “服务器”。 | 您可以随意将其更改为您选择的受支持服务器。 | */ 'server' => env('OCTANE_SERVER', 'roadrunner'), /* |-------------------------------------------------------------------------- | 强制 HTTPS |-------------------------------------------------------------------------- | | 当该配置值设置为 “true” 时, | Octane 将通知框架必须使用 HTTPS 协议生成链接。 | 否则,您的链接可能会使用普通 HTTP 生成。 | */ 'https' => env('OCTANE_HTTPS', false), /* |-------------------------------------------------------------------------- | Octane 监听器 |-------------------------------------------------------------------------- | | Octane 事件的所有事件监听器定义如下 | 这些监听器负责为下一个请求重置应用程序的状态。 | 您可以将自己的监听器添加到列表中。 | */ 'listeners' => [ WorkerStarting::class => [ EnsureUploadedFilesAreValid::class, ], RequestReceived::class => [ ...Octane::prepareApplicationForNextOperation(), ...Octane::prepareApplicationForNextRequest(), // ], RequestHandled::class => [ // ], RequestTerminated::class => [ // ], TaskReceived::class => [ ...Octane::prepareApplicationForNextOperation(), // ], TickReceived::class => [ ...Octane::prepareApplicationForNextOperation(), // ], OperationTerminated::class => [ FlushTemporaryContainerInstances::class, // DisconnectFromDatabases::class, // CollectGarbage::class, ], WorkerErrorOccurred::class => [ ReportException::class, StopWorkerIfNecessary::class, ], WorkerStopping::class => [ // ], ], /* |-------------------------------------------------------------------------- | 预热 / 刷新绑定 |-------------------------------------------------------------------------- | | 下面列出的绑定要么在工作进程启动时预热, | 要么在每次新请求之前刷新。 | 刷新绑定将强制容器在被请求时再次解析该绑定。 | */ 'warm' => [ ...Octane::defaultServicesToWarm(), ], 'flush' => [ // ], /* |-------------------------------------------------------------------------- | 垃圾收集阈值 |-------------------------------------------------------------------------- | | 在执行诸如 Octane 之类的长期存在的 PHP 脚本时, | 内存可能会在被 PHP 清除之前积累。 | 如果您的应用程序消耗了此数量的兆字节, | 您可以强制 Octane 运行垃圾回收。 | */ 'garbage' => 50, /* |-------------------------------------------------------------------------- | 最长执行时间 |-------------------------------------------------------------------------- | | (提示) 0 表示没有最长时间限制 | */ 'max_execution_time' => 30, /* |-------------------------------------------------------------------------- | Octane 缓存表 |-------------------------------------------------------------------------- | | 在使用 Swoole 时, | 您可以利用由 Swoole 表提供支持的 Octane 缓存。 | 您可以使用以下配置选项设置最大行数以及每行的字节数。 | */ 'cache' => [ 'rows' => 1000, 'bytes' => 10000, ], /* |-------------------------------------------------------------------------- | Octane Swoole 表 |-------------------------------------------------------------------------- | | 在使用 Swoole 时, | 您可以根据应用程序的需要定义额外的表。 | 这些表可用于存储特定 Swoole 服务器上其他工作人员需要快速访问的数据。 | */ 'tables' => [ 'example:1000' => [ 'name' => 'string:1000', 'votes' => 'int', ], ],];
接下来,你需要决定自己是使用 RoadRunner 还是 Swoole,然后,你可以通过自定义配置文件中的 server
键来配置要使用的应用程序服务器。这可以是 swoole
或 roadrunner
。
RoadRunner 是一个用 Go 编写的应用程序服务器,它在 PHP 本身没有任何其他依赖项。如果您不想安装额外的 PHP 扩展,请选择 RoadRunner。您可以通过 composer 安装 RoadRunner,如下所示:
composer require spiral/roadrunner
Swoole 带来了 RoadRunner 无法提供的一些好处。由于 Swoole 是 PHP 之上的扩展,PHP 本身获得了一些很酷的新特性,如 “ticks” 和 “协程”,我将稍后介绍。RoadRunner 没有这些功能,所以如果你想使用它们,你应该使用 Swoole。
你可以使用以下方法安装 Swoole 扩展:
pecl install swoole
在安装过程中,系统会询问你是否希望在 Swoole 中支持 HTTP2, curl, JSON和 open_ssl。您可以安全地使用此处的默认值(即 off
),因为这些设置只会影响协程之类的东西。
一旦您安装了 RoadRunner 或 Swoole,并在您的 octane.php
配置文件中定义了它,您就可以启动 Octane 并让它为您的 Laravel 应用程序提供服务。
php artisan octane:start
默认情况下,Octane 将在端口 8000 上启动服务器,因为您可以通过 http://localhost:8000
200 GET / .............. 14.23 ms200 GET / .............. 1.93 ms200 GET / .............. 2.06 ms다음으로 RoadRunner를 사용할지 Swoole을 사용할지 결정한 다음 구성 파일에서
server 키를 사용하여 애플리케이션 서버를 구성합니다. <code>swoole
또는 roadrunner
일 수 있습니다.
npm install --save-dev chokidar
php artisan octane:start --watch🎜설치 프로세스 중에 Swoole에서 HTTP2, 컬, JSON 및 open_ssl을 지원할 것인지 묻는 메시지가 표시됩니다. 이러한 설정은 코루틴과 같은 항목에만 영향을 미치므로 여기에서는 기본값(예:
off
)을 안전하게 사용할 수 있습니다. 🎜octane.php
구성 파일에 정의한 후에는 Octane을 실행하고 Laravel 애플리케이션을 제공할 수 있습니다. 🎜php artisan octane:start --workers=2🎜기본적으로 Octane은
http://localhost:8000
를 통해 브라우저에서 애플리케이션에 액세스할 수 있으므로 포트 8000에서 서버를 시작합니다. 🎜🎜이 경로를 방문하여 Laravel 앱을 확인해 보세요! 여러 요청을 하는 경우 첫 번째 요청은 프레임워크가 시작되는 위치이므로 약간 느린 반면, 다른 요청은 시작된 후 메모리에서 프레임워크를 사용할 수 있기 때문에 훨씬 더 빠릅니다. 🎜200 GET / .............. 14.23 ms200 GET / .............. 1.93 ms200 GET / .............. 2.06 ms
如果现在添加新的 /test
路由 - 并尝试访问,将收到 404 响应! 这是因为请求访问的是 Octane 服务内存中的框架(及其所有路由/代码)。 因此,为了查看代码更改,需要重启 Octane 服务。 这导致在开发过程中非常麻烦,所以 Octane 提供了一种很好的方式来自动监视代码库的更改并自动重启 Octane 服务。
为了完成这项工作,请确保安装 Chokidar - 基于 NodeJS 的文件监视库:
npm install --save-dev chokidar
然后,您可以在 “watch” 模式下启动 Octane 服务器,如下所示:
php artisan octane:start --watch
现在,下次您对代码库进行更改时,系统会检测到这一点,Octane 将为请求重启工作程序,您可以立即看到您的更改。
说到 Workers,默认情况下,Octane 将为您拥有的每个 CPU 内核启动一个 worker,但是您也可以改变这一点,通过 --workers
选项传递 octane:start
命令:
php artisan octane:start --workers=2
正如文中所提到的,Octane 带有一些 Swoole 特定的功能,我认为非常有趣,让我们来看看它们。
Octane 可以同时执行多个任务。 它们会同时执行,并在所有任务完成后立即返回。
以下是 GitHub 上 Octane 文档中的一个示例:
use App\User;use App\Server;use Laravel\Octane\Facades\Octane;[$users, $servers] = Octane::concurrently([ fn () => User::all(), fn () => Server::all(),]);
在这个例子中,我们同时获取所有用户和所有服务。 为了证明它们是同时执行,这是另一个例子:
Octane::concurrently([ function () { sleep(0.5); return 1; }, function () { sleep(1); return 2; }, ]);
我们同时执行两个「任务」,一旦它们完成,PHP 将继续执行代码。 一个任务等待 0.5 秒,另一个任务等待 1 秒。 由于它们同时被执行,在两个单独的任务中,PHP 将等待 1 秒(不是 1.5 秒),直到两个结果都可用。 此功能是同时执行多个较小任务的绝佳方式。
就像 --workers
选项一样,您也可以自定义 Octane 提供 --task-workers
的数量。
Octane 与 Swoole 相结合,允许您注册 ticks
- 这些操作将在给定的时间间隔内自动执行。类似 JavasScript 中的 setInterval
方法。不幸的是,目前无法停止这些 ticks,但您可以像这样在应用程序中注册它们:
Octane::tick('simple-ticker', fn () => ray('Ticking...')) ->seconds(10);
Octane 和 Swoole 中的另一个新功能是新缓存驱动程序。根据官方文档,此缓存驱动程序提供读与写速度高达每秒 200 万次操作。在幕后,Swoole 使用 Swoole 表 将数据缓存在共享内存中,所有 workers 都可以访问该表。当服务器重新启动时,缓存数据将被刷新,因为缓存仅保留在内存中。
要使用此缓存,您可以通过 Cache 门面的 otance
缓存存储访问它,如下所示:
Cache::store('octane')->put('framework', 'Laravel', 30);
另一个很酷的新增功能,即 Swoole 和 Octane 特有的是 “缓存间隔” 能力。这允许您将信息存储在 Octane 缓存中并在给定的时间间隔内刷新数据:
use Illuminate\Support\Str;Cache::store('octane')->interval('random', function () { return Str::random(10);}, seconds: 5)
基于 Swoole 表 的功能,您可以创建自己想要在 Octane 应用程序中访问的表。这些表具有与缓存相同的性能优势,允许您以结构化方式保存数据。请记住,当服务器重新启动时,您存储在此表中的所有数据都会丢失。
要配置表,您可以在 octane.php
配置文件中的 tables
部分创建一个条目:
'tables' => [ 'example:1000' => [ 'name' => 'string:1000', 'votes' => 'int', ],],
在示例中,我们定义了一个名为 example
的表,该表最多可容纳 1.000 个条目/行。表的结构体是一个 name
,它的最大长度为 1000 的字符串, 然而 votes
,它是一个整数。
要把数据写入表中,我们可以使用 Octane::table
方法:
use Laravel\Octane\Facades\Octane;Octane::table('example')->set('a-unique-identifier', [ 'name' => 'Marcel Pociot', 'votes' => 1000,]);
要取出数据,我们可以在表上使用 get
方法,如下所示:
return Octane::table('example')->get('a-unique-identifier');
当您想要为 Octane 准备现有应用程序或从开头开始构建新应用程序时,您需要注意几件事。
由于 Octane 将框架保存在所有 workers 的内存中,因此所有应用程序服务提供商之类的东西只会注册和启动一次。但 Octane 不可能重置您在自己的应用程序代码中可能具有的全局状态。
目前可以在 GitHub 上找到的官方文档包含一些您应该注意的最常见场景。
Octane 的一个尚未被记录的特性是:无论何时在Octane内的应用程序服务器中发生什么事情,都可以注册自定义监听器。您可以监听以下事件:
要将监听器附加到这些事件,您可以将它们添加到您的 octane.php
配置文件中。
当一个新的 Octane worker 启动时,您可以指定一个在启动过程中要「预热」的容器绑定 / 服务列表。这意味着,在 Worker 启动时,服务容器将已经使指定的服务可用,以便后续请求可以立即访问它们。
Octane 已经有一个内部服务列表,它会在每个工作程序启动过程中保持热加载,您也可以将自己的服务添加到 octane.php
配置文件中的 warm
部分。
与此类似,您还可以在新请求进入之前定义要刷新的服务列表。这对于在请求过程中被操纵的服务很有用,当新请求进入时,您希望将其重置为原始/卸载状态。
如果 Octane 没有给您提升足够的速度,您可以通过 Octane 内置的路由来进一步提高速度。您可以通过 Octane 自定义路由,如下所示:
Octane::route('GET', '/fast', function() {});
这些路由非常快,因为它们完全跳过了 Laravel 的路由系统(因此这些路由不提供任何类型的中间件)— 这对只需要快速提供数据的端点很有帮助。
由于 Laravel 中的 HTTP 内核未用于这些请求,您需要自己返回一个 Symfony Response 对象,如下所示:
use Symfony\Component\HttpFoundation\Response;Octane::route('GET', '/faster', function() { return new Response('Hello from Octane.');});
当然,所有服务提供者都已启动且可用,因此您仍然可以使用这些服务执行 Eloquent 查询等。
Laravel Octane 肯定会给您的 Laravel 应用程序带来巨大的性能提升 — 我们都喜欢性能提升,不是吗?我们真的需要这种性能提升吗?好吧,也许 — 我认为这取决于您正在运行的应用程序。但对我来说更重要的是 Laravel 正在(再次)推动 PHP 的当前状态。Octane 不仅是一个至少需要 PHP 8 的包,并且它还在 PHP 世界中推出了令人兴奋的新功能,例如协程、ticks,以及使用 artisan 命令服务您应用程序的思维模式。
我为 Octane 的未来感到兴奋!
原文地址:https://beyondco.de/blog/laravel-octane-introduction
译文地址:https://learnku.com/laravel/t/61524
위 내용은 라라벨 옥탄이란 무엇인가요? 그것을 사용하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!