swoole加速laravel框架

HelloWorld-Q發表於2021-05-08
  1. swoole是什麼?如何安裝?
  2. swoole初步體驗
  3. php執行的執行模式
  4. swoole加速laravel的原理
  5. laravel使用swoole的元件

1. swoole是什麼?如何安裝?

1.1 swoole是什麼

Swoole 是一個使用 C++ 語言編寫的基於非同步事件驅動和協程的並行網路通訊引擎,為 PHP 提供協程、高效能網路程式設計支援。提供了多種通訊協議的網路伺服器和客戶端模組,可以方便快速的實現 TCP/UDP服務、高效能Web、WebSocket服務、物聯網、實時通訊、遊戲、微服務等,使 PHP 不再侷限於傳統的 Web 領域。

swoole的優勢

  • 常駐記憶體,避免重複載入帶來的效能損耗,提升海量效能
  • 協程非同步,提高對 I/O 密集型場景併發處理能力(如:微信開發、支付、登入等)
  • 方便地開發 Http、WebSocket、TCP、UDP 等應用,可以與硬體通訊

1.2 swoole的安裝

1.獲取swoole安裝包,地址:https://pecl.php.net/package/swoole

swoole加速laravel框架

2\. 解壓swoole安裝包
tar –zxvf swoole-4.6.6.tar

3. 將解壓出來的安裝包copy到php容器
docker cp /home/swoole php:/usr/src/php/ext/swoole

4. 安裝swoole
docker-php-ext-install swoole

5. 完成安裝後,檢視swoole資訊
php --ri swoole

2. swoole初步體驗

安裝好swoole之後,我們可以簡單來進行一次體驗,也是驗證我們是否安裝完好swoole以及swoole的擴充套件。程式碼如下:

<?php
$http = new swoole\Http\Server('0.0.0.0', 9501);

$http->on('Request', function ($request, $response) {
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});

$http->start();
?>

程式碼解釋:
例項化一個swoole的http服務類,並傳遞監聽的埠以及host,HTTP 伺服器只需要關注請求響應即可,所以只需要監聽一個 onRequest 事件。當有新的 HTTP 請求進入就會觸發此事件。事件回撥函式有 2 個引數,一個是 $request 物件,包含了請求的相關資訊,如 GET/POST 請求的資料。
另外一個是 response 物件,對 request 的響應可以通過操作 response 物件來完成。$response->end() 方法表示輸出一段 HTML 內容,並結束此請求

0.0.0.0 表示監聽所有 IP 地址,一臺伺服器可能同時有多個 IP,如 127.0.0.1 本地迴環 IP192.168.1.100 區域網 IP210.127.20.2 外網 IP,這裡也可以單獨指定監聽一個 IP
9501 監聽的埠,如果被佔用程式會丟擲致命錯誤,中斷執行。

測試如下:

swoole加速laravel框架

啟動之後在容器內部進行請求:

swoole加速laravel框架

3. php執行的執行模式

3.1 cgi模式

swoole加速laravel框架

CGI 是一個協議,所以,PHP 有自己對 CGI 的實現,那就是 PHP-CGI。可是呢,隨著技術的發展,人們開始意識到,PHP-CGI 的效能不是那麼盡如人意。PHP 在執行的時候,是依賴配置檔案 php.ini的。所以,每當 PHP-CGI 開始工作的時候,它是完完全全的一個新程式,它需要重新載入配置檔案並初始化,這就造成了很大的資源和時間的浪費。

那麼怎麼解決這個問題呢?

3.2 fastcgi模式

swoole加速laravel框架

為什麼不預先載入好配置,然後,每一個執行的任務只需要複製當前的程式,不就能避免上面的浪費了麼。於是, FastCGI 便橫空出世。

FastCGI,全稱 Fast Common Gateway Interface,中文譯作“快速公共網管介面”。沒錯,這又是個協議。當然,這個協議並不是因為 PHP 才有的。

對於 PHP 來說,httpd 是通過自身來實現一個 FastCGI 的模組的。它會預先載入好 php.ini 檔案中的配置。待到有請求進入需要 PHP 處理時,PHP 就不需要再對 php.ini 重新載入了。這也就是每改動過 php.ini 後都要重啟 httpd 服務的原因。

php-fpm 也是 FastCGI 的一種實現。通常我們是將 Nginx 的 PHP 處理部分代理到 php-fpm 的埠上,交給 php-fpm 來處理。而 php-fpm 同樣是通過預先載入配置,然後給到子程式的方式的,它會對程式做一些管理。

4. swoole加速laravel的原理

http-Server服務,這是服務可以用於web專案開發中、也可以用於對laravel,thinkphp等框架進行加速; 如果想利用swoole加速框架、框架的條件必須是ioc型別因為swoole是常駐記憶體。

swoole解決的問題

我們用的 PHP 主要用於 web 開發,通過 nginx、apache 等服務端程式呼叫 php-fpm 處理服務端的業務邏輯,處理完後 php 撤消記憶體並返回結果。一個 web 請求就要載入一次 php 的全部檔案,需要的系統資源開銷很大,這是目前 php-fpm 的缺點之一;並且因為 php-fpm 在一次請求結束就釋放記憶體,無法做連線池,也不合適 service 端的開發。

php-fpm 的優缺點:

優點:

  • 部署簡單
  • 除錯方便
  • 基於傳統 php 的專案非常多,易於參考

缺點:

  • 每次 http 請求都要載入全部的專案檔案
  • php-fpm 效能不佳,併發效能不好
  • 核心不支援非同步IO處理,IO密集型請求響應變長
  • 對網路通訊協議的支援不好,應用場景基本被限制在web領域

swoole是如何解決php-fpm遇到的問題的?

swoole如何避免檔案的反覆載入:

swoole是完全的長駐記憶體的,長駐記憶體一個最大的好處就是可以效能加速。在fpm模式下,我們處理一個請求,通常會有一些空消耗,比如框架共用檔案載入,配置檔案載入,那麼在swoole中,可以在onworkerstart的時候提前一次性把一些必要的檔案和配置載入好,不必每次receive重複載入一遍,這樣能提升不小的效能。

常駐記憶體 常駐記憶體。傳統 PHP框架或者單檔案,在處理每個請求之前,都要做一遍載入框架檔案、配置的操作,請求完成之後會釋放所有資源和記憶體,無須擔心記憶體洩漏。但是如果請求數量上升,併發很高的時候,快速建立資源,又馬上釋放,會導致 PHP 程式執行效率急劇下降。而使用 Swoole 則沒有這個問題:PHP的程式碼載入到記憶體後,擁有更長的生命週期,這樣建立的資料庫連線和其他大的物件,不被釋放。每次請求只需要處理很少的程式碼,而這些程式碼只在第一次執行時,被 PHP 解析器編譯,駐留記憶體。以後都是直接載入 OPCODE ,讓 Zend 引擎直接執行。另外,之前PHP不能實現的,如資料庫連線池,快取連線池都可以在Swoole引擎下實現。系統的執行效率會大大提高。

5. laravel使用swoole的元件

在 Laravel 應用中使用 Swoole 之前,先通過 Composer 安裝 LaravelS 擴充套件包:

composer require hhxsv5/laravel-s

該擴充套件包具備自動發現功能(Laravel 5.5 以上版本可用),無需手動在 config/app.php 配置檔案中註冊,安裝完成後,執行如下 Artisan 命令相應指令碼和配置檔案釋出到根目錄下:

php artisan laravels publish

該命令會發布配置檔案 laravels.php 到 config 目錄下,以及指令碼檔案到 bin 目錄下:

你可以在配置檔案中對 Swoole 進行一些基本配置,而指令碼檔案主要用於管理 Swoole 服務的啟動、過載、關閉等操作。

配置

也可以在.env 修改工作程式數並重啟服務

LARAVELS_LISTEN_IP=0.0.0.0
LARAVELS_LISTEN_PORT=5200
LARAVELS_WORKER_NUM=4

更多配置項: github.com/hhxsv5/laravel-s/blob/m...

啟動 LaravelS

完成上述操作後,就可以通過 [^php bin/laravels start] 命令啟動 LaravelS 了:

swoole加速laravel框架

這樣,Swoole 服務就被啟動起來,監聽 5200 埠,如果有請求傳送到這個埠,它就可以進行處理。

此外 php bin/laravels 還支援其它命令對 LaravelS 進行管理:

命令 說明
start 啟動laravelS,展示已啟動的程式列表 “ps -ef / grep laravelS” 支援選項 “-d /–daemonize” 以守護程式的方式執行,此選項將覆蓋laravels.php中swoole.daemonize設定;支援選項 “-e /–env” 用來指定執行的環境,如 –env=testing將會優先使用配置.env.testing,這個特性要求laravel5.2+
stop 停止laravelS
restart 停止laravelS,支援選項 “-d / –daemonize ”和 “-e / –env”
reload 平滑重啟索引Task/Worker,這些程式包含了你的業務程式碼,不會重啟Master/Manger/Timer/Custom程式
info 顯示元件的版本資訊
help 顯示幫助資訊

通過 Supervisor 管理 LaravelS

如果是在生產環境使用,推薦使用 Supervisor 對 LaravelS 服務進行管理,從而提供服務的穩定性,相應的配置示例如下:

[program:laravel-s-test]
command=php /www/wwwroot/lms/blog/bin/laravels start -i
numprocs=1
autostart=true
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile=/www/wwwroot/lms/blog/storage/logs/supervisord-stdout.log

其中 /www/wwwroot/lms/blog 為 Web 專案的目錄,你可以根據自己的專案路徑進行修改。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
有夢想的人睡不著,沒有夢想的人睡不醒。

相關文章