1,前言
- swoole: PHP的協(xié)程高性能網(wǎng)絡(luò)通信引擎,使用完全同步的代碼實現(xiàn)異步程序。PHP代碼無需額外增加任何關(guān)鍵詞,底層自動進行協(xié)程調(diào)度,實現(xiàn)異步IO。
- websocket:可以建立服務(wù)器與客戶端的雙向連接,用于實時通訊,可替代AJax輪詢,節(jié)約服務(wù)器資源。
- Laravel-swoole:laravel的一個擴展,Laravel的一個請求需要加載很多文件,消耗IO。在swoole上運行l(wèi)aravel,第一次運行時把所有PHP腳本文件都加載的內(nèi)存中,然后每次請求都不用再讀取腳本文件,速度能提升多少,大家可以想象一下。
2,安裝
以下是主要特點swooletw/laravel-swoole:
- 在swoole上運行l(wèi)aravel
- 出色的性能提升高達30倍
- 支持在Laravel中運行WebSocket服務(wù)器
通過composer安裝
$ composer require swooletw/laravel-swoole
安裝的時候請注意版本號,如果php版本和服務(wù)器swoole的版本比較低,可以安裝低版本的laravel-swoole
使用此擴展要確保服務(wù)器已安裝PHP的Swoole擴展。Swoole擴展快速安裝命令:
pecl install swoole
安裝完畢后,要的php.ini里添加extension=swoole.so,啟用擴展
注冊服務(wù)提供者,添加到config/app.php的providers數(shù)組中,laravel5.5以上版本跳過此步驟
[
'providers' => [
SwooleTW\Http\LaravelServiceProvider::class,
],
]
3,配置
如果使用默認配置可以跳過此步驟
生成配置文件,運行以下命令在/config命令看生成配置文件swoole_http.php并swoole_websocket.php
$ php artisan vendor:publish --tag=laravel-swoole
swoole_http.php(部分配置)
| 鍵 | 值 |
|---|---|
| server.host | 服務(wù)器監(jiān)聽主機地址(127.0.0.1) |
| server.port | 服務(wù)器偵聽端口(要注意服務(wù)器是否開放端口) |
| public_path | 項目的public文件夾路徑(base_path('public')) |
| handle_static_files | 確定是否使用Swoole響應(yīng)靜態(tài)文件的請求。(您應(yīng)該使用Nginx來處理靜態(tài)文件。false) |
| websocket.enabled | 是否啟動socket,設(shè)為true才可使用websocket |
swoole_websocket.php(部分配置)
| 鍵 | 值 |
|---|---|
| handler | 用于onOpen和onClose回調(diào)函數(shù)的Websocket處理程序 |
| parser | 默認的websocket框架解析器 |
| route_file | Websocket路由文件路徑 |
4,在swoole上運行項目
通過命令行啟動swoole:http 服務(wù)
php artisan swoole:http start
看到以下信息表示運行成功
Starting swoole http server...
Swoole http server started: <http://127.0.0.1:1215>
現(xiàn)在來測試下速度怎么樣
測試前的準備
- 安裝wrk測試工具
- 把域名一正常解析到80端口
- 把域名二也解析到80端口,在nginx中配置反向代理
location ~ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://localhost:1215;
}
開始測試了,先來測試域名一
wrk -t4 -c100 http://www.***.com
Running 10s test @ http://www.***.com
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.37s 486.14ms 1.91s 53.85%
Req/Sec 8.56 9.03 38.00 88.24%
61 requests in 10.11s, 488.94KB read
Socket errors: connect 0, read 0, write 0, timeout 48
Requests/sec: 6.03
Transfer/sec: 48.36KB
平均每秒請求量6.03
再來試試域名二的,也就是運行在swoole上的
wrk -t4 -c100 http://www.***.com
Running 10s test @ http://www.***.com
4 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 334.99ms 53.56ms 505.09ms 82.25%
Req/Sec 87.50 69.07 240.00 66.67%
2929 requests in 10.02s, 21.54MB read
Requests/sec: 292.37
Transfer/sec: 2.15MB
平均每秒請求量292,速度提升將近50倍。這個差距也出乎我的意料,可能測試的頁面只是一個首頁,沒有復(fù)雜的運算和mysql限制才提升這么明顯。當(dāng)然實際應(yīng)用中影響速度的肯定不局限于IO,還有mysql的效率,實際效果會低于測試數(shù)據(jù),但10倍以上的提升應(yīng)該是沒有問題的。