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' => [
SwooleTW\Http\LaravelServiceProvider::class,
],
]
如果你使用 Lumen ,請將下面的代碼添加到 bootstrap/app.php
:
$app->register(SwooleTW\Http\LumenServiceProvider::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 查看官方包, 也可以參考 官方文檔 獲取更多信息。
更多現代化 PHP 知識,請前往 Laravel / PHP 知識社區