什麼是 Octane
Laravel Octane 是使用高效能應用程式伺服器來大幅提升 Laravel 應用程式效能的套件。 在一般的 PHP-FPM 中,每次請求都會啟動並結束應用程式。而在 Octane 中,應用程式只會啟動一次並保留在記憶體中,後續請求便能高速處理。 與 PHP-FPM 最大的差異在於,應用程式的啟動流程(服務提供者的註冊等)不會在每次請求時重複執行。只需啟動一次,後續便能以超高速處理請求。支援的伺服器
Octane 支援下列三種伺服器。在 Laravel Cloud 中,建議使用 FrankenPHP 執行 Octane,並提供完整的託管支援。
安裝與設定
套件安裝
Octane 初始化設定
config/octane.php。
FrankenPHP
選擇 FrankenPHP 後,Octane 會自動下載二進位檔,無需額外步驟。RoadRunner
選擇 RoadRunner 後,Octane 會自動下載二進位檔。Swoole
Swoole 是 PHP 擴充,透過 PECL 安裝。啟動方式
啟動伺服器
8000 連接埠啟動,可透過 http://localhost:8000 存取。
指定伺服器
指定 worker 數量
監控檔案變更
開發過程中,修改檔案後若不重啟伺服器就無法反映。使用--watch 旗標可自動重啟。
其他管理指令
依賴注入的注意事項
由於 Octane 會將應用程式保留在記憶體中,因此服務提供者的register 或 boot 只會在伺服器啟動時執行一次。同一個應用程式實體會在請求之間被重複使用,所以將容器或請求注入物件建構子時需要特別留意。
容器的注入
若將容器直接注入單例的建構子,將會重複使用舊的容器。app() 與 Container::getInstance() 一律回傳最新的容器,因此是安全的。
Request 的注入
在 controller 方法或路由閉包中對
Illuminate\Http\Request 進行型別提示是安全的。全域輔助函式 request() 也一律回傳目前的 request。設定 repository 的注入
config() 一律回傳最新的設定 repository,因此是安全的。
記憶體洩漏對策
由於 Octane 會將應用程式保留在記憶體中,因此若將資料累積於靜態屬性等處,將造成記憶體洩漏。以 max-requests 回收 worker
透過在 worker 處理一定數量的請求後自動重啟,可降低記憶體洩漏影響。預設為 500 個請求。設定最大執行時間
可在config/octane.php 中設定請求的最大執行時間,預設為 30 秒。
並行任務(僅 Swoole)
若使用 Swoole,可透過Octane::concurrently() 並行執行多項處理。
--task-workers 指定。
Tick 與 Interval(僅 Swoole)
在 Swoole 中,可註冊以指定間隔定期執行的處理。請在服務提供者的boot 方法中註冊。
Octane 快取(僅 Swoole)
這是使用 Swoole Swoole table 的超高速記憶體內快取。每秒最多可讀寫 200 萬次。Interval 快取
以指定間隔自動更新的快取。Swoole Table(僅 Swoole)
可定義任何 worker 皆可存取的自訂記憶體內資料表。透過config/octane.php 的 tables 進行設定。
Octane::table() 方法。
正式環境的運作
Nginx + Octane 的架構
正式環境中通常會在 Nginx 後方執行 Octane。Nginx 負責靜態檔案的傳遞與 SSL 終止,並將動態請求 proxy 至 Octane。以 Supervisor 讓其常駐
在正式環境中會使用 Supervisor 讓 Octane 常駐啟動。啟用 HTTPS
若要透過 Octane 產生 HTTPS 連結,請在.env 中設定以下項目。
與 Laravel Cloud 整合
Laravel Cloud 提供使用 FrankenPHP 的 Octane 完整託管支援。無需設定 Nginx 或 Supervisor,只需兩個步驟即可啟用 Octane。1
安裝套件
安裝 Octane。
octane:install 指令可以執行,但並非必要。2
在 Laravel Cloud 啟用 Octane
開啟環境中 App 運算叢集的設定,將 「Use Octane as runtime」 開啟並儲存部署。Laravel Cloud 會自動以 FrankenPHP + Octane 建置並啟動應用程式。