1.是什么限制Laravel框架的速度酥泛?
Laravel框架啟動(dòng)的時(shí)候需要加載很多文件,再加上其出了名的生態(tài)環(huán)境好鳖宾,所以在開(kāi)發(fā)過(guò)程中我們就會(huì)發(fā)現(xiàn)有非常多的已經(jīng)造好的輪子光羞,這也就使得Laravel的一次啟動(dòng)的磁盤(pán)IO特別高(就是要加載很多文件嘛),博主之前的一遍博客Laravel5框架性能優(yōu)化技巧中也提到過(guò)一些優(yōu)化穴豫,但是并沒(méi)有實(shí)質(zhì)的解決磁盤(pán)IO高的問(wèn)題凡简。
既然已經(jīng)知道了問(wèn)題所在,那就很容易解決了精肃,只要每次啟動(dòng)Laravel的時(shí)候不都重新加載這些文件就好了潘鲫,這時(shí)候大名鼎鼎的swoole就登場(chǎng)了。
2.Swoole
Swoole號(hào)稱(chēng)重新定義了PHP肋杖,它是一個(gè)PHP擴(kuò)展,使得PHP可以使用異步的方式執(zhí)行挖函,就像node一樣状植,而且還能使用socket浊竟,為PHP提供了一系列異步IO、事件驅(qū)動(dòng)津畸、并行數(shù)據(jù)結(jié)構(gòu)功能振定。Swoole 可以廣泛應(yīng)用于互聯(lián)網(wǎng)、移動(dòng)通信肉拓、企業(yè)軟件后频、云計(jì)算、網(wǎng)絡(luò)游戲暖途、物聯(lián)網(wǎng)(IOT)卑惜、車(chē)聯(lián)網(wǎng)、智能家居等領(lǐng)域驻售。它可以大大提升項(xiàng)目的性能露久。
3.使用Swoole提升Laravel的性能
在現(xiàn)有的輪子中,感覺(jué)下面這兩個(gè)還是非常不錯(cuò)的欺栗,可以自行選擇
博主選擇了第一個(gè)毫痕,不要問(wèn)我為什么,任性迟几!然后我們就開(kāi)始吧消请!
使用composer安裝:
composer require swooletw/laravel-swoole
如果你使用的是laravel,那么在 config/app.php 的 providers 數(shù)組中加上
SwooleTW\Http\LaravelServiceProvider::class,</pre>
如果你使用的是lumen类腮,那么在 bootstrap/app.php 中加入如下代碼
$app->register(SwooleTW\Http\LumenServiceProvider::class);
將配置文件導(dǎo)出到 config 目錄下
php artisan vendor:publish --provider="SwooleTW\Http\HttpServiceProvider"
然后可以去 config/swoole_http.php 中配置信息
'server' => [
'host' => env('SWOOLE_HTTP_HOST', '127.0.0.1'),
'port' => env('SWOOLE_HTTP_PORT', '1215'),
'options' => [
'pid_file' => env('SWOOLE_HTTP_PID_FILE', base_path('storage/logs/swoole_http.pid')),
'log_file' => env('SWOOLE_HTTP_LOG_FILE', base_path('storage/logs/swoole_http.log')),
'daemonize' => env('SWOOLE_HTTP_DAEMONIZE', 1),
],
],
host和post不用多說(shuō)臊泰,options里面的具體配置可以去swoole官網(wǎng)查看詳細(xì)參數(shù)信息。
swoole_http.php 里還提供配置 providers 數(shù)組存哲,
'providers' => [
// App\Providers\AuthServiceProvider::class,
]
因?yàn)槭褂胹woole作為http后因宇,這些providers會(huì)被存到內(nèi)存中,所以這里配置的是每次請(qǐng)求都想要重新注冊(cè)和重新啟動(dòng)的providers祟偷。
Artisan Commands
這個(gè)輪子完全使用artisan命令來(lái)操作察滑。
php artisan swoole:http start|stop|restart|reload
依次是,啟動(dòng)/停止/重啟/重載修肠。
所以我們可以通過(guò)以下命令來(lái)啟動(dòng)swoole_http_server
php artisan swoole:http start</pre>
現(xiàn)在可以通過(guò)配置文件里的host和port去訪問(wèn)Laravel了贺辰,例如我的配置是: 127.0.0.1:1215
注意:該拓展是不支持熱啟動(dòng)的,所以每次有代碼更新都要重啟服務(wù) php artisan swoole:http restart 嵌施。當(dāng)然你也可以在linux上寫(xiě)一個(gè)腳本饲化,讓 git pull 代碼后自動(dòng)重啟服務(wù)。
4.性能測(cè)試
下面讓我們來(lái)看兩張圖吗伤。
使用swoole前:
[圖片上傳失敗...(image-a03e45-1514339910261)]
使用swoole后:
[圖片上傳失敗...(image-5cca42-1514339910261)]
這里是使用Apache的ab測(cè)試工具
ab -n1000 -c10 http://127.0.0.1:1215
我們可以驚奇的發(fā)現(xiàn)吃靠, Request per second 從原來(lái)的20多,提升到了600多足淆。將近提升了30倍左右巢块。啊礁阁,多么痛的領(lǐng)悟!族奢!
5.使用Nginx代理
swoole在官網(wǎng)也提到過(guò):swoole_http_server對(duì)Http協(xié)議的支持并不完整姥闭,建議僅作為應(yīng)用服務(wù)器。并且在前端增加Nginx作為代理越走。
那么棚品,我們就增加需要配置nginx.conf里的server:
server {
listen 80;
server_name your.domain.com;
root /path/to/laravel/public;
index index.php;
location = /index.php {
# Ensure that there is no such file named "not_exists"
# in your "public" directory.
try_files /not_exists @swoole;
}
location / {
try_files $uri $uri/ @swoole;
}
location @swoole {
set $suffix "";
if ($uri = /index.php) {
set $suffix "/";
}
proxy_set_header Host $host;
proxy_set_header SERVER_PORT $server_port;
proxy_set_header REMOTE_ADDR $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# IF https
# proxy_set_header HTTPS "on";
proxy_pass http://127.0.0.1:1215$suffix;
}
}
至此,大功告成廊敌,你可以像平常一樣訪問(wèn)你的網(wǎng)站了铜跑。