使用Swoole加速Laravel(正式環境中)

1 Laravel的速度瓶頸在哪?

1.1 已有的一些優化方法

1.1.1 laravel官方提供了一些優化laravel的優化方法php

php artisan optimize
php artisan config:cache
php artisan route:cache
 

1.1.2 使用opcache加速,PHP是個解釋型語言執行的時候先得把程序讀進來,由Zend引擎編譯成opcode。最後Zend虛擬機順次執行這些opcode完成操做。opcache起到的做用就是緩存opcode,從而減小編譯的時間,減小CPU密集。node


1.1.3 使用PHP7.1,不要問我爲何laravel

1.2 磁盤IO上的瓶頸

Laravel自己啓動須要的文件就不少,外加其出了名的生態環境好,開發中咱們會不少不少現有的輪子,使得一次啓動的磁盤IO特別高(就是要加載不少文件嘛),雖然官方的php artisan optimize方法優化了文件的加載,但並無實際解決IO上的問題。
知道了問題那就很容易解決了,只要不要每次啓動都從新加載就行了,下面輪到Swoole上場啦。git


2 Swoole

Swoole是一個PHP擴展,使得PHP使用異步的方式執行,就像node同樣,並且還能使用socket,爲PHP提供了一系列異步IO、事件驅動、並行數據結構功能。具體的安裝方法這就不說了,本身谷歌吧。github


3 現有的輪子

搜搜github上已有的swoole啓動laravel的輪子,找了三個輪子web

scil/LaravelFly
chongyi/swoole-laravel-framework
garveen/laravooleredis

用了LaravelFly,聽名字感受感受挺酷,結果不如人意,實在不喜歡它那種強硬的啓動方式。跟Laravel的風格-'優雅' 很不搭。因而又想本身寫,結果寫到一半發現laravoole這個項目有更新,而後啓動方式(使用artisan命令,沒更新前是用的bash腳本啓動),代碼風格都很酷,這不就是我想作的東西嘛!sql


chongyi/swoole-laravel-framework這個輪子是我在寫輪子的時候,做者在微信羣裏分享的,有興趣的朋友能夠試試,我還沒試過。segmentfault


4 LARAVOOLE中的幾個注意點

能夠看看做者的文檔,我就只總結下我在用的過程當中遇到的幾個點
1 你無法再也不使用一下的超全局變量,由於它們是WEB服務器建立的,而一個非熱啓動的項目使用他們可能會形成變量污染,你能夠從Laravel的Request類中拿到你要的數據。centos

$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
 

2 由於我要開發微信相關的,因此使用了EASYWECHAT這個包,可是這個包的oauth方法使用的是原生的SESSION,因此這邊也要改爲redis等其它方式去存儲session。具體代碼以下。

//在你的控制器或者中間件中
  public function handle(Request $request, Closure $next)
  //省略代碼
  $redirect = config('app.url') . $request->getRequestUri();//這個地址要求帶着token
                
  $options = [
                'app_id' => config('app.appid'),
                'secret' => config('app.secret'),
                'oauth' => [
                    'scopes' => ['snsapi_userinfo'],
                    'callback' => $redirect,
                ],
             ];

   $app = new Application($options);
   //使用laravel session替代原生session
   $app->oauth->setRequest($request);
   //省略下面代碼
  }
 

3 不支持熱啓動了,因此每次更新代碼後都須要從新啓動Laravoole進程。

$ php artisan laravoole restart
 

如須要支持熱啓動,請自行谷歌 swoole + inotify,大概原理就是用inotify監控文件變動,若是更新了重啓swoole,若是正式環境中還能夠本身寫個部署腳本,git pull後重啓服務等,方法不少不一一列舉。

5 愉快的準備測試啦

測試機子:
阿里雲
centos6.5
雙核
4G
無視帶寬影響,向本機請求,測試結果以下,測了幾回,平均在700RPS左右。原先的只有20多RPS。

 

 

摘自:https://segmentfault.com/a/1190000007894118

相關文章
相關標籤/搜索