1邮丰,前言
- swoole: PHP的協(xié)程高性能網(wǎng)絡(luò)通信引擎,使用完全同步的代碼實(shí)現(xiàn)異步程序卸察。PHP代碼無(wú)需額外增加任何關(guān)鍵詞,底層自動(dòng)進(jìn)行協(xié)程調(diào)度铅祸,實(shí)現(xiàn)異步IO坑质。
- websocket:可以建立服務(wù)器與客戶端的雙向連接,用于實(shí)時(shí)通訊临梗,可替代AJax輪詢涡扼,節(jié)約服務(wù)器資源。
- Laravel-swoole:laravel的一個(gè)擴(kuò)展盟庞,Laravel的一個(gè)請(qǐng)求需要加載很多文件吃沪,消耗IO。在swoole上運(yùn)行l(wèi)aravel什猖,第一次運(yùn)行時(shí)把所有PHP腳本文件都加載的內(nèi)存中票彪,然后每次請(qǐng)求都不用再讀取腳本文件,速度能提升多少不狮,大家可以想象一下降铸。
2,安裝
以下是主要特點(diǎn)swooletw/laravel-swoole:
- 在swoole上運(yùn)行l(wèi)aravel
- 出色的性能提升高達(dá)30倍
- 支持在Laravel中運(yùn)行WebSocket服務(wù)器
通過composer安裝
$ composer require swooletw/laravel-swoole
安裝的時(shí)候請(qǐng)注意版本號(hào),如果php版本和服務(wù)器swoole的版本比較低摇零,可以安裝低版本的laravel-swoole
使用此擴(kuò)展要確保服務(wù)器已安裝PHP的Swoole擴(kuò)展推掸。Swoole擴(kuò)展快速安裝命令:
pecl install swoole
安裝完畢后,要的php.ini里添加extension=swoole.so驻仅,啟用擴(kuò)展
注冊(cè)服務(wù)提供者谅畅,添加到config/app.php的providers數(shù)組中,laravel5.5以上版本跳過此步驟
[
'providers' => [
SwooleTW\Http\LaravelServiceProvider::class,
],
]
3噪服,配置
如果使用默認(rèn)配置可以跳過此步驟
生成配置文件毡泻,運(yùn)行以下命令在/config命令看生成配置文件swoole_http.php并swoole_websocket.php
$ php artisan vendor:publish --tag=laravel-swoole
swoole_http.php(部分配置)
鍵 | 值 |
---|---|
server.host | 服務(wù)器監(jiān)聽主機(jī)地址(127.0.0.1) |
server.port | 服務(wù)器偵聽端口(要注意服務(wù)器是否開放端口) |
public_path | 項(xiàng)目的public文件夾路徑(base_path('public')) |
handle_static_files | 確定是否使用Swoole響應(yīng)靜態(tài)文件的請(qǐng)求。(您應(yīng)該使用Nginx來處理靜態(tài)文件粘优。false) |
websocket.enabled | 是否啟動(dòng)socket仇味,設(shè)為true才可使用websocket |
swoole_websocket.php(部分配置)
鍵 | 值 |
---|---|
handler | 用于onOpen和onClose回調(diào)函數(shù)的Websocket處理程序 |
parser | 默認(rèn)的websocket框架解析器 |
route_file | Websocket路由文件路徑 |
4,在swoole上運(yùn)行項(xiàng)目
通過命令行啟動(dòng)swoole:http 服務(wù)
php artisan swoole:http start
看到以下信息表示運(yùn)行成功
Starting swoole http server...
Swoole http server started: <http://127.0.0.1:1215>
現(xiàn)在來測(cè)試下速度怎么樣
測(cè)試前的準(zhǔn)備
- 安裝wrk測(cè)試工具
- 把域名一正常解析到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;
}
開始測(cè)試了邪铲,先來測(cè)試域名一
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
平均每秒請(qǐng)求量6.03
再來試試域名二的,也就是運(yùn)行在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
平均每秒請(qǐng)求量292无拗,速度提升將近50倍带到。這個(gè)差距也出乎我的意料,可能測(cè)試的頁(yè)面只是一個(gè)首頁(yè),沒有復(fù)雜的運(yùn)算和mysql限制才提升這么明顯揽惹。當(dāng)然實(shí)際應(yīng)用中影響速度的肯定不局限于IO被饿,還有mysql的效率,實(shí)際效果會(huì)低于測(cè)試數(shù)據(jù)搪搏,但10倍以上的提升應(yīng)該是沒有問題的狭握。