搜尋
首頁php框架LaravelLaravel Octane是什麼?怎麼用?

Taylor Otwell 已經在他的 Laracon 線上演講中展示了 Laravel 最新的開源包 Octane,新的包在 Github 上可用,每個人都可以進行測試。

在這篇部落格文章中,我們將探索 Laravel Octane,並告訴您它是什麼,如果安裝並使用它,以及您可能需要它的原因。 【推薦學習:laravel教學

什麼是Laravel Octane?

Laravel Octane 是一個開源包,它可以提升你的Laravel 應用性能。 Laravel Octane 需要 PHP 8,如果您還在使用 7.x,您需要升級您的 PHP 版本。在底層,Octane 使用了 Swoole 和 RoadRunner 兩個應用程式伺服器,負責服務和啟動你的 Laravel 程式。

對於透過像 nginx 這樣的網頁伺服器提供服務的傳統 PHP 應用程序,每個傳入請求都會產生一個 PHP-FPM 工作器。這意味著每個請求都會啟動一個單獨的  PHP 進程,該進程運行所有的必要任務,以便為此請求提供服務。

在Laravel 的情況下,這意味著需要啟動框架,所有服務提供者在容器中註冊他們的服務,所有提供者都自己啟動,請求通過中間件類列表,命中您的控制器,呈現視圖等。直到我們最終從我們的伺服器得到回應。

使用 Swoole 或 RoadRunner 後,我們仍然為每個傳入的 HTTP 請求提供一個工作線程,但它們都共用相同的開機框架。這意味著只有第一個傳入請求將引導框架(包括所有服務提供者等)。而其他所有請求則可以使用現成的框架。這就是 Octane 如此之快的原因。

開始使用 Laravel Octane

由於 Laravel Octane 是一個包,因此您需要將它安裝為特定應用程式的依賴項。您可以透過 composer 安裝它:

composer require laravel/octane

在應用程式中安裝 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 鍵來設定要使用的應用程式伺服器。這可以是 swooleroadrunner

RoadRunner

RoadRunner 是一個用 Go 寫的應用程式伺服器,它在 PHP 本身沒有任何其他依賴項。如果您不想安裝額外的 PHP 擴展,請選擇 RoadRunner。您可以透過 composer 安裝 RoadRunner,如下所示:

composer require spiral/roadrunner

#Swoole

Swoole 帶來了 RoadRunner 無法提供的一些好處。由於 Swoole 是 PHP 之上的擴展,PHP 本身獲得了一些很酷的新特性,如 “ticks” 和 “協程”,我將稍後介紹。 RoadRunner 沒有這些功能,所以如果你想使用它們,你應該使用 Swoole。

你可以使用以下方法安裝 Swoole 擴充功能:

pecl install swoole

在安裝過程中,系統會詢問你是否希望在 Swoole 中支援 HTTP2, curl, JSON和 open_ssl。您可以安全地使用此處的預設值(即 off),因為這些設定只會影響協程之類的東西。

啟動Octane

一旦您安裝了RoadRunner 或Swoole,並在您的octane.php 設定檔中定義了它,您就可以啟動Octane 並讓它為您的Laravel 應用程式提供服務。

php artisan octane:start

預設情況下,Octane 會在連接埠 8000 上啟動伺服器,因為您可以透過 http://localhost: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

说到 Workers,默认情况下,Octane 将为您拥有的每个 CPU 内核启动一个 worker,但是您也可以改变这一点,通过 --workers 选项传递 octane:start 命令:

php artisan octane:start --workers=2

Swoole 特定功能

正如文中所提到的,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 的数量。

Ticks / 间隔

Octane 与 Swoole 相结合,允许您注册 ticks - 这些操作将在给定的时间间隔内自动执行。类似 JavasScript 中的 setInterval 方法。不幸的是,目前无法停止这些 ticks,但您可以像这样在应用程序中注册它们:

Octane::tick('simple-ticker', fn () => ray('Ticking...'))
        ->seconds(10);

Octane 缓存

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)

Octane 表

基于 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 准备现有应用程序或从开头开始构建新应用程序时,您需要注意几件事。

由于 Octane 将框架保存在所有 workers 的内存中,因此所有应用程序服务提供商之类的东西只会注册和启动一次。但 Octane 不可能重置您在自己的应用程序代码中可能具有的全局状态。

目前可以在 GitHub 上找到的官方文档包含一些您应该注意的最常见场景。

监听器

Octane 的一个尚未被记录的特性是:无论何时在Octane内的应用程序服务器中发生什么事情,都可以注册自定义监听器。您可以监听以下事件:

  • WorkerStarting
  • RequestReceived
  • RequestHandled
  • RequestTerminated
  • TaskReceived
  • TickReceived
  • OperationTerminated
  • WorkerErrorOccurred
  • WorkerStopping

要将监听器附加到这些事件,您可以将它们添加到您的 octane.php 配置文件中。

服务预热和刷新

当一个新的 Octane worker 启动时,您可以指定一个在启动过程中要「预热」的容器绑定 / 服务列表。这意味着,在 Worker 启动时,服务容器将已经使指定的服务可用,以便后续请求可以立即访问它们。

Octane 已经有一个内部服务列表,它会在每个工作程序启动过程中保持热加载,您也可以将自己的服务添加到 octane.php 配置文件中的 warm 部分。

与此类似,您还可以在新请求进入之前定义要刷新的服务列表。这对于在请求过程中被操纵的服务很有用,当新请求进入时,您希望将其重置为原始/卸载状态。

Octane 路由

如果 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 查询等。

好吧…那为什么是 Octane?

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

以上是Laravel Octane是什麼?怎麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:learnku。如有侵權,請聯絡admin@php.cn刪除
laravel单点登录方法详解laravel单点登录方法详解Jun 15, 2022 am 11:45 AM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于单点登录的相关问题,单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,下面一起来看一下,希望对大家有帮助。

一起来聊聊Laravel的生命周期一起来聊聊Laravel的生命周期Apr 25, 2022 pm 12:04 PM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于Laravel的生命周期相关问题,Laravel 的生命周期从public\index.php开始,从public\index.php结束,希望对大家有帮助。

laravel中guard是什么laravel中guard是什么Jun 02, 2022 pm 05:54 PM

在laravel中,guard是一个用于用户认证的插件;guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套自己的认证体系。

laravel中asset()方法怎么用laravel中asset()方法怎么用Jun 02, 2022 pm 04:55 PM

laravel中asset()方法的用法:1、用于引入静态文件,语法为“src="{{asset(‘需要引入的文件路径’)}}"”;2、用于给当前请求的scheme前端资源生成一个url,语法为“$url = asset('前端资源')”。

实例详解laravel使用中间件记录用户请求日志实例详解laravel使用中间件记录用户请求日志Apr 26, 2022 am 11:53 AM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于使用中间件记录用户请求日志的相关问题,包括了创建中间件、注册中间件、记录用户访问等等内容,下面一起来看一下,希望对大家有帮助。

laravel中间件基础详解laravel中间件基础详解May 18, 2022 am 11:46 AM

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于中间件的相关问题,包括了什么是中间件、自定义中间件等等,中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制,下面一起来看一下,希望对大家有帮助。

laravel的fill方法怎么用laravel的fill方法怎么用Jun 06, 2022 pm 03:33 PM

在laravel中,fill方法是一个给Eloquent实例赋值属性的方法,该方法可以理解为用于过滤前端传输过来的与模型中对应的多余字段;当调用该方法时,会先去检测当前Model的状态,根据fillable数组的设置,Model会处于不同的状态。

laravel路由文件在哪个目录里laravel路由文件在哪个目录里Apr 28, 2022 pm 01:07 PM

laravel路由文件在“routes”目录里。Laravel中所有的路由文件定义在routes目录下,它里面的内容会自动被框架加载;该目录下默认有四个路由文件用于给不同的入口使用:web.php、api.php、console.php等。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!