首頁 > 軟體

使用 Swoole 來加速你的 Laravel 應用

2020-06-16 16:51:52

Swoole 是為 PHP 開發的生產級非同步程式設計框架。 他是一個純 C 開發的擴充套件, 他允許 PHP 開發者在 PHP 中寫 高效能,可延伸的並行 TCP, UDP, Unix socket, HTTP, WebSocket 服務, 而不需要擁有太多的非阻塞 I/O 程式設計和低階別的 Linux 核心知識。 你可以把 Swoole 想象成 NodeJS, 但對於 PHP 來說將有更高效能。

為什麼要在 Swoole 上執行 Laravel?

下圖展示了 PHP 的生命週期。正如你所看到的那樣,當你每次執行 PHP 指令碼的時候,PHP都需要初始化模組並為你的執行環境啟動Zend引擎。並且將 PHP 指令碼編譯為 OpCodes 以便 Zend引擎執行。

但是, 這樣的生命週期需要在每次請求的時候都執行一遍。因為單個請求建立的環境在請求執行結束後會立即銷毀。

換句話說, 在傳統的 PHP 生命週期中, 為了指令碼執行而浪費了大量的時間去建立和銷毀資源。想象一下像 Laravel 這樣的框架, 在每次請求中需要載入多少檔案? 同時也浪費了大量的 I/O 操作

因此如果我們利用 Swoole 內建一個應用級別的 Server, 並且所有指令碼檔案在載入一次之後便可以儲存在記憶體中呢? 這就是為什麼我們需要嘗試在 Swoole 上執行 Laravel。 Swoole 可以提供強大效能而 Laravel 則可以提供優雅程式碼結構使用。這倆兒真是完美組合 !

安裝

以下是 swooletw/laravel-swoole 的主要特點:
在 Swoole 執行 Laravel/Lumen 應用
出色的效能提升至 30x
沙盒模式隔離應用程式容器
支援在 Laravel 應用中執行 WebSocket 伺服器
支援 Socket.io 協定
支援 Swoole 表跨進程共用

使用 Composer 安裝:
$ composer require swooletw/laravel-swoole

這個包依賴於 Swoole 。在使用這個包之前,請確保你的機器安裝了正確的 Swoole 。使用下面的命令快速安裝(linux):
pecl install swoole

在安裝這個擴充套件之後,你需要編輯 php.ini 新增  extension=swoole.so。
php -i | grep php.ini                      # check the php.ini file location
sudo echo "extension=swoole.so" > php.ini  # add the extension=swoole.so to the end of php.ini
php -m | grep swoole                      # check if the swoole extension has been enabled

存取 官網 獲取更多的資訊。

注意:Swoole 現在只支援 Linux 和 OSX 。Windows 伺服器現在還不支援。

然後,新增服務提供者:

如果你使用 Laravel ,在 config/app.php 服務提供者陣列新增該服務提供者:
[
    'providers' => [
        SwooleTWHttpLaravelServiceProvider::class,
    ],
]

如果你使用 Lumen ,請將下面的程式碼新增到 bootstrap/app.php:
$app->register(SwooleTWHttpLumenServiceProvider::class);

這個包支援包自動發現機制。如果你執行 Laravel 5.5 以上版本,你可以跳過這一步。

建立並執行起來

現在,你可以執行以下的命令來啟動 Swoole HTTP 服務。
$ php artisan swoole:http start

然後你可以看到以下資訊:
Starting swoole http server...
Swoole http server started: <http://127.0.0.1:1215>

現在可以通過存取 http://127.0.0.1:1215 來進入 Laravel 應用。

基準測試

使用 MacBook Air 13寸(2015年產)及乾淨的 Lumen 5.5 專案測試:
 基準測試工具: wrk
wrk -t4 -c100 http://your.app

基於 FPM 的 Nginx
Running 10s test @ http://lumen.app:9999
  4 threads and 100 connections
  Thread Stats  Avg      Stdev    Max  +/- Stdev
    Latency    1.14s  191.03ms  1.40s    90.31%
    Req/Sec    22.65    10.65    50.00    65.31%
  815 requests in 10.07s, 223.65KB read
Requests/sec:    80.93
Transfer/sec:    22.21KB

Swoole HTTP 服務
Running 10s test @ http://127.0.0.1:1215
  4 threads and 100 connections
  Thread Stats  Avg      Stdev    Max  +/- Stdev
    Latency    11.58ms    4.74ms  68.73ms  81.63%
    Req/Sec    2.19k  357.43    2.90k    69.50%
  87879 requests in 10.08s, 15.67MB read
Requests/sec:  8717.00
Transfer/sec:      1.55MB

更多資訊

Github Repo 檢視官方包, 也可以參考 官方文件 獲取更多資訊。

本文永久更新連結地址https://www.linuxidc.com/Linux/2018-05/152425.htm


IT145.com E-mail:sddin#qq.com