<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Laravel Octane 解疑及基礎(chǔ)用法

          共 9564字,需瀏覽 20分鐘

           ·

          2021-10-14 18:15

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

          在這篇博客文章中,我們將探索 Laravel Octane,并告訴您它是什么,如果安裝并使用它,以及您可能需要它的原因。

          什么是 Laravel Octane?

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

          對于通過像 nginx 這樣的網(wǎng)絡(luò)服務(wù)器提供服務(wù)的傳統(tǒng) PHP 應(yīng)用程序,每個傳入請求都會產(chǎn)生一個 PHP-FPM 工作器。這意味著每個請求都會啟動一個單獨的 PHP 進程,該進程運行所有的必要任務(wù),以便為該請求提供服務(wù)。

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

          使用 Swoole 或 RoadRunner 后,我們?nèi)匀粸槊總€傳入的 HTTP 請求提供一個工作線程,但它們都共享相同的引導(dǎo)框架。這意味著只有第一個傳入請求將引導(dǎo)框架(包括所有服務(wù)提供者等)。而其他所有請求則可以使用現(xiàn)成的框架。這就是 Octane 如此之快的原因。

          開始使用 Laravel Octane

          由于 Laravel Octane 是一個包,因此您需要將它安裝為特定應(yīng)用程序的依賴項。您可以通過 composer 安裝它:

          composer require laravel/octane

          在應(yīng)用程序中安裝 Octane 后,請確保運行?php artisan octane:install。這將發(fā)布 Octane 的配置文件,并將?rr?- RoadRunner 二進制文件添加到?.gitignore?文件中。

          正如我所說,Octane 將發(fā)布其配置文件,如下所示:

          return [

          /*
          |--------------------------------------------------------------------------
          | Octane 服務(wù)器
          |--------------------------------------------------------------------------
          |
          | 該值決定了 Octane 在通過 CLI 啟動、
          | 重啟或停止服務(wù)器時將使用的默認 “服務(wù)器”。
          | 您可以隨意將其更改為您選擇的受支持服務(wù)器。
          |
          */


          'server' => env('OCTANE_SERVER', 'roadrunner'),

          /*
          |--------------------------------------------------------------------------
          | 強制 HTTPS
          |--------------------------------------------------------------------------
          |
          | 當該配置值設(shè)置為 “true” 時,
          | Octane 將通知框架必須使用 HTTPS 協(xié)議生成鏈接。
          | 否則,您的鏈接可能會使用普通 HTTP 生成。
          |
          */


          'https' => env('OCTANE_HTTPS', false),

          /*
          |--------------------------------------------------------------------------
          | Octane 監(jiān)聽器
          |--------------------------------------------------------------------------
          |
          | Octane 事件的所有事件監(jiān)聽器定義如下
          | 這些監(jiān)聽器負責為下一個請求重置應(yīng)用程序的狀態(tài)。
          | 您可以將自己的監(jiān)聽器添加到列表中。
          |
          */


          '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 => [
          //
          ],
          ],

          /*
          |--------------------------------------------------------------------------
          | 預(yù)熱 / 刷新綁定
          |--------------------------------------------------------------------------
          |
          | 下面列出的綁定要么在工作進程啟動時預(yù)熱,
          | 要么在每次新請求之前刷新。
          | 刷新綁定將強制容器在被請求時再次解析該綁定。
          |
          */


          'warm' => [
          ...Octane::defaultServicesToWarm(),
          ],

          'flush' => [
          //
          ],

          /*
          |--------------------------------------------------------------------------
          | 垃圾收集閾值
          |--------------------------------------------------------------------------
          |
          | 在執(zhí)行諸如 Octane 之類的長期存在的 PHP 腳本時,
          | 內(nèi)存可能會在被 PHP 清除之前積累。
          | 如果您的應(yīng)用程序消耗了此數(shù)量的兆字節(jié),
          | 您可以強制 Octane 運行垃圾回收。
          |
          */


          'garbage' => 50,

          /*
          |--------------------------------------------------------------------------
          | 最長執(zhí)行時間
          |--------------------------------------------------------------------------
          |
          | (提示) 0 表示沒有最長時間限制
          |
          */


          'max_execution_time' => 30,

          /*
          |--------------------------------------------------------------------------
          | Octane 緩存表
          |--------------------------------------------------------------------------
          |
          | 在使用 Swoole 時,
          | 您可以利用由 Swoole 表提供支持的 Octane 緩存。
          | 您可以使用以下配置選項設(shè)置最大行數(shù)以及每行的字節(jié)數(shù)。
          |
          */


          'cache' => [
          'rows' => 1000,
          'bytes' => 10000,
          ],

          /*
          |--------------------------------------------------------------------------
          | Octane Swoole 表
          |--------------------------------------------------------------------------
          |
          | 在使用 Swoole 時,
          | 您可以根據(jù)應(yīng)用程序的需要定義額外的表。
          | 這些表可用于存儲特定 Swoole 服務(wù)器上其他工作人員需要快速訪問的數(shù)據(jù)。
          |
          */


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

          ];

          接下來,你需要決定自己是使用 RoadRunner 還是 Swoole,然后,你可以通過自定義配置文件中的?server?鍵來配置要使用的應(yīng)用程序服務(wù)器。這可以是?swoole?或?roadrunner。

          RoadRunner

          RoadRunner 是一個用 Go 編寫的應(yīng)用程序服務(wù)器,它在 PHP 本身沒有任何其他依賴項。如果您不想安裝額外的 PHP 擴展,請選擇 RoadRunner。您可以通過 composer 安裝 RoadRunner,如下所示:

          composer require spiral/roadrunner

          Swoole

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

          你可以使用以下方法安裝 Swoole 擴展:

          pecl install swoole

          在安裝過程中,系統(tǒng)會詢問你是否希望在 Swoole 中支持 HTTP2, curl, JSON和 open_ssl。您可以安全地使用此處的默認值(即?off),因為這些設(shè)置只會影響協(xié)程之類的東西。

          啟動 Octane

          一旦您安裝了 RoadRunner 或 Swoole,并在您的?octane.php?配置文件中定義了它,您就可以啟動 Octane 并讓它為您的 Laravel 應(yīng)用程序提供服務(wù)。

          php artisan octane:start

          默認情況下,Octane 將在端口 8000 上啟動服務(wù)器,因為您可以通過?http://localhost:8000?在瀏覽器中訪問您的應(yīng)用程序。

          繼續(xù),訪問該路由并查看 Laravel 應(yīng)用程序!如果你發(fā)出了多個請求,將會看到第一個請求稍微慢一點,因為這是框架啟動的地方,而其他請求則明顯更快,因為它們可以從內(nèi)存中使用啟動后的框架。

          200 GET / .............. 14.23 ms
          200 GET / .............. 1.93 ms
          200 GET / .............. 2.06 ms

          更改代碼

          如果現(xiàn)在添加新的?/test?路由 - 并嘗試訪問,將收到 404 響應(yīng)!這是因為請求訪問的是 Octane 服務(wù)內(nèi)存中的框架(及其所有路由/代碼)。因此,為了查看代碼更改,需要重啟 Octane 服務(wù)。這導(dǎo)致在開發(fā)過程中非常麻煩,所以 Octane 提供了一種很好的方式來自動監(jiān)視代碼庫的更改并自動重啟 Octane 服務(wù)。

          為了完成這項工作,請確保安裝?Chokidar?- 基于 NodeJS 的文件監(jiān)視庫:

          npm install --save-dev chokidar

          然后,您可以在 “watch” 模式下啟動 Octane 服務(wù)器,如下所示:

          php artisan octane:start --watch

          現(xiàn)在,下次您對代碼庫進行更改時,系統(tǒng)會檢測到這一點,Octane 將為請求重啟工作程序,您可以立即看到您的更改。

          自定義 Workers

          說到 Workers,默認情況下,Octane 將為您擁有的每個 CPU 內(nèi)核啟動一個 worker,但是您也可以改變這一點,通過?--workers?選項傳遞?octane:start?命令:

          php artisan octane:start --workers=2

          Swoole 特定功能

          正如文中所提到的,Octane 帶有一些 Swoole 特定的功能,我認為非常有趣,讓我們來看看它們。

          并發(fā)任務(wù)

          Octane 可以同時執(zhí)行多個任務(wù)。它們會同時執(zhí)行,并在所有任務(wù)完成后立即返回。

          以下是 GitHub 上 Octane 文檔中的一個示例:

          use App\User;
          use App\Server;
          use Laravel\Octane\Facades\Octane;

          [$users, $servers] = Octane::concurrently([
          fn () => User::all(),
          fn () => Server::all(),
          ]);

          在這個例子中,我們同時獲取所有用戶和所有服務(wù)。為了證明它們是同時執(zhí)行,這是另一個例子:

          Octane::concurrently([
          function () {
          sleep(0.5);
          return 1;
          },
          function () {
          sleep(1);
          return 2;
          },
          ]);

          我們同時執(zhí)行兩個「任務(wù)」,一旦它們完成,PHP 將繼續(xù)執(zhí)行代碼。一個任務(wù)等待 0.5 秒,另一個任務(wù)等待 1 秒。由于它們同時被執(zhí)行,在兩個單獨的任務(wù)中,PHP 將等待 1 秒(不是 1.5 秒),直到兩個結(jié)果都可用。此功能是同時執(zhí)行多個較小任務(wù)的絕佳方式。

          就像?--workers?選項一樣,您也可以自定義 Octane 提供?--task-workers?的數(shù)量。

          Ticks / 間隔

          Octane 與 Swoole 相結(jié)合,允許您注冊?ticks?- 這些操作將在給定的時間間隔內(nèi)自動執(zhí)行。類似 JavasScript 中的?setInterval?方法。不幸的是,目前無法停止這些 ticks,但您可以像這樣在應(yīng)用程序中注冊它們:

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

          Octane 緩存

          Octane 和 Swoole 中的另一個新功能是新緩存驅(qū)動程序。根據(jù)官方文檔,此緩存驅(qū)動程序提供讀與寫速度高達每秒 200 萬次操作。在幕后,Swoole 使用?Swoole 表?將數(shù)據(jù)緩存在共享內(nèi)存中,所有 workers 都可以訪問該表。當服務(wù)器重新啟動時,緩存數(shù)據(jù)將被刷新,因為緩存僅保留在內(nèi)存中。

          要使用此緩存,您可以通過 Cache 門面的?otance?緩存存儲訪問它,如下所示:

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

          另一個很酷的新增功能,即 Swoole 和 Octane 特有的是 “緩存間隔” 能力。這允許您將信息存儲在 Octane 緩存中并在給定的時間間隔內(nèi)刷新數(shù)據(jù):

          use Illuminate\Support\Str;

          Cache::store('octane')->interval('random', function () {
          return Str::random(10);
          }, seconds: 5)

          Octane 表

          基于?Swoole 表?的功能,您可以創(chuàng)建自己想要在 Octane 應(yīng)用程序中訪問的表。這些表具有與緩存相同的性能優(yōu)勢,允許您以結(jié)構(gòu)化方式保存數(shù)據(jù)。請記住,當服務(wù)器重新啟動時,您存儲在此表中的所有數(shù)據(jù)都會丟失。

          要配置表,您可以在?octane.php?配置文件中的?tables?部分創(chuàng)建一個條目:

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

          在示例中,我們定義了一個名為?example?的表,該表最多可容納 1.000 個條目/行。表的結(jié)構(gòu)體是一個?name,它的最大長度為 1000 的字符串, 然而?votes,它是一個整數(shù)。

          要把數(shù)據(jù)寫入表中,我們可以使用?Octane::table?方法:

          use Laravel\Octane\Facades\Octane;

          Octane::table('example')->set('a-unique-identifier', [
          'name' => 'Marcel Pociot',
          'votes' => 1000,
          ]);

          要取出數(shù)據(jù),我們可以在表上使用?get?方法,如下所示:

          return Octane::table('example')->get('a-unique-identifier');

          Octane 的注意事項

          當您想要為 Octane 準備現(xiàn)有應(yīng)用程序或從開頭開始構(gòu)建新應(yīng)用程序時,您需要注意幾件事。

          由于 Octane 將框架保存在所有 workers 的內(nèi)存中,因此所有應(yīng)用程序服務(wù)提供商之類的東西只會注冊和啟動一次。但 Octane 不可能重置您在自己的應(yīng)用程序代碼中可能具有的全局狀態(tài)。

          目前可以在?GitHub?上找到的官方文檔包含一些您應(yīng)該注意的最常見場景。

          監(jiān)聽器

          Octane 的一個尚未被記錄的特性是:無論何時在Octane內(nèi)的應(yīng)用程序服務(wù)器中發(fā)生什么事情,都可以注冊自定義監(jiān)聽器。您可以監(jiān)聽以下事件:

          • WorkerStarting

          • RequestReceived

          • RequestHandled

          • RequestTerminated

          • TaskReceived

          • TickReceived

          • OperationTerminated

          • WorkerErrorOccurred

          • WorkerStopping

          要將監(jiān)聽器附加到這些事件,您可以將它們添加到您的?octane.php?配置文件中。

          服務(wù)預(yù)熱和刷新

          當一個新的 Octane worker 啟動時,您可以指定一個在啟動過程中要「預(yù)熱」的容器綁定 / 服務(wù)列表。這意味著,在 Worker 啟動時,服務(wù)容器將已經(jīng)使指定的服務(wù)可用,以便后續(xù)請求可以立即訪問它們。

          Octane 已經(jīng)有一個內(nèi)部服務(wù)列表,它會在每個工作程序啟動過程中保持熱加載,您也可以將自己的服務(wù)添加到?octane.php?配置文件中的?warm?部分。

          與此類似,您還可以在新請求進入之前定義要刷新的服務(wù)列表。這對于在請求過程中被操縱的服務(wù)很有用,當新請求進入時,您希望將其重置為原始/卸載狀態(tài)。

          Octane 路由

          如果 Octane 沒有給您提升足夠的速度,您可以通過 Octane 內(nèi)置的路由來進一步提高速度。您可以通過 Octane 自定義路由,如下所示:

          Octane::route('GET', '/fast', function() {

          });

          這些路由非???,因為它們完全跳過了 Laravel 的路由系統(tǒng)(因此這些路由不提供任何類型的中間件)— 這對只需要快速提供數(shù)據(jù)的端點很有幫助。

          由于 Laravel 中的 HTTP 內(nèi)核未用于這些請求,您需要自己返回一個 Symfony Response 對象,如下所示:

          use Symfony\Component\HttpFoundation\Response;

          Octane::route('GET', '/faster', function() {
          return new Response('Hello from Octane.');
          });

          當然,所有服務(wù)提供者都已啟動且可用,因此您仍然可以使用這些服務(wù)執(zhí)行 Eloquent 查詢等。

          好吧…那為什么是 Octane?

          Laravel Octane 肯定會給您的 Laravel 應(yīng)用程序帶來巨大的性能提升 — 我們都喜歡性能提升,不是嗎?我們真的需要這種性能提升嗎?好吧,也許 — 我認為這取決于您正在運行的應(yīng)用程序。但對我來說更重要的是 Laravel 正在(再次)推動 PHP 的當前狀態(tài)。Octane 不僅是一個至少需要 PHP 8 的包,并且它還在 PHP 世界中推出了令人興奮的新功能,例如協(xié)程、ticks,以及使用 artisan 命令服務(wù)您應(yīng)用程序的思維模式。

          我為 Octane 的未來感到興奮!


          瀏覽 60
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩一区二区黄片视频在线看 | 欧美奇米影视1873 | 国产精品久久久免费 | 人成视频在线观看一区二区 | 日本色逼|