Taylor Otwell 已經在他的 Laracon 在線演講中展示了 Laravel 最新的開源包 Octane,新的包在 Github 上可用,每個人都可以進行測試。
在這篇博客文章中,我們將探索 Laravel Octane,并告訴您它是什么,如果安裝并使用它,以及您可能需要它的原因。
什么是 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 鍵來配置要使用的應用程序服務器。這可以是 swoole 或 roadrunner。
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 ms
200 GET / .............. 1.93 ms
200 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 命令服務您應用程序的思維模式。
————————————————
原文作者:Summer
轉自鏈接:https://learnku.com/laravel/t/61524
版權聲明:著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請保留以上作者信息和原文鏈接。
- 文檔說明
- 開始
- linux
- 常用命令
- ps -ef
- lsof
- netstat
- 解壓縮
- 復制
- 權限
- 其他
- lnmp集成安裝
- supervisor
- 安裝
- supervisor進程管理
- nginx
- 域名映射
- 負載均衡配置
- lnmp集成環境安裝
- nginx源碼安裝
- location匹配
- 限流配置
- 日志配置
- 重定向配置
- 壓縮策略
- nginx 正/反向代理
- HTTPS配置
- mysql
- navicat創建索引
- 設置外網鏈接mysql
- navicat破解
- sql語句學習
- 新建mysql用戶并賦予權限
- php
- opcache
- 設計模式
- 在CentOS下安裝crontab服務
- composer
- 基礎
- 常用的包
- guzzle
- 二維碼
- 公共方法
- 敏感詞過濾
- IP訪問頻次限制
- CURL
- 支付
- 常用遞歸
- 數據排序
- 圖片相關操作
- 權重分配
- 毫秒時間戳
- base64<=>圖片
- 身份證號分析
- 手機號相關操作
- 項目搭建 公共處理函數
- JWT
- 系統函數
- json_encode / json_decode 相關
- 數字計算
- 數組排序
- php8
- jit特性
- php8源碼編譯安裝
- laravel框架
- 常用artisan命令
- 常用查詢
- 模型關聯
- 創建公共方法
- 圖片上傳
- 中間件
- 路由配置
- jwt
- 隊列
- 定時任務
- 日志模塊
- laravel+swoole基本使用
- 拓展庫
- 請求接口log
- laravel_octane
- 微信開發
- token配置驗證
- easywechart 獲取用戶信息
- 三方包
- webman
- win下熱更新代碼
- 使用laravel db listen 監聽sql語句
- guzzle
- 使用workman的httpCLient
- 修改隊列后代碼不生效
- workman
- 安裝與使用
- websocket
- eleticsearch
- php-es 安裝配置
- hyperf
- 熱更新
- 安裝報錯
- swoole
- 安裝
- win安裝swoole-cli
- google登錄
- golang
- 文檔地址
- 標準庫
- time
- 數據類型
- 基本數據類型
- 復合數據類型
- 協程&管道
- 協程基本使用
- 讀寫鎖 RWMutex
- 互斥鎖Mutex
- 管道的基本使用
- 管道select多路復用
- 協程加管道
- beego
- gin
- 安裝
- 熱更新
- 路由
- 中間件
- 控制器
- 模型
- 配置文件/conf
- gorm
- 初始化
- 控制器 模型查詢封裝
- 添加
- 修改
- 刪除
- 聯表查詢
- 環境搭建
- Windows
- linux
- 全局異常捕捉
- javascript
- 常用函數
- vue
- vue-cli
- 生產環境 開發環境配置
- 組件通信
- 組件之間通信
- 父傳子
- 子傳父
- provide->inject (非父子)
- 引用元素和組件
- vue-原始寫法
- template基本用法
- vue3+ts項目搭建
- vue3引入element-plus
- axios 封裝網絡請求
- computed 計算屬性
- watch 監聽
- 使用@符 代替文件引入路徑
- vue開發中常用的插件
- vue 富文本編輯
- nuxt
- 學習筆記
- 新建項目踩坑整理
- css
- flex布局
- flex PC端基本布局
- flex 移動端基本布局
- 常用css屬性
- 盒子模型與定位
- 小說分屏顯示
- git
- 基本命令
- fetch
- 常用命令
- 每次都需要驗證
- git pull 有沖突時
- .gitignore 修改后不生效
- 原理解析
- tcp與udp詳解
- TCP三次握手四次揮手
- 緩存雪崩 穿透 更新詳解
- 內存泄漏-內存溢出
- php_fpm fast_cgi cig
- redis
- 相關三方文章
- API對外接口文檔示范
- elaticsearch
- 全文檢索
- 簡介
- 安裝
- kibana
- 核心概念 索引 映射 文檔
- 高級查詢 Query DSL
- 索引原理
- 分詞器
- 過濾查詢
- 聚合查詢
- 整合應用
- 集群
- docker
- docker 簡介
- docker 安裝
- docker 常用命令
- image 鏡像命令
- Contrainer 容器命令
- docker-compose
- redis 相關
- 客戶端安裝
- Linux 環境下安裝
- uni
- http請求封裝
- ios打包
- 視頻縱向播放
- 日記
- 工作日記
- 情感日志
- 壓測
- ab
- ui
- thorui
- 開發規范
- 前端
- 后端
- 狀態碼
- 開發小組未來規劃