1 Laravel的速度瓶頸在哪?
1.1 已有的一些優化方法
1.1.1 laravel官方提供了一些優化laravel的優化方法
php artisan optimize php artisan config:cache php artisan route:cache
1.1.2 使用opcache加速,PHP是個解釋型語言執行的時候先得把程序讀進來,由Zend引擎編譯成opcode。最后Zend虛擬機順次執行這些opcode完成操作。opcache起到的作用就是緩存opcode,從而減少編譯的時間,減少CPU密集。
1.1.3 使用PHP7.1,不要問我為什么
1.2 磁盤IO上的瓶頸
Laravel本身啟動需要的文件就很多,外加其出了名的生態環境好,開發中我們會很多很多現有的輪子,使得一次啟動的磁盤IO特別高(就是要加載很多文件嘛),雖然官方的php artisan optimize方法優化了文件的加載,但並沒有實際解決IO上的問題。
知道了問題那就很容易解決了,只要不要每次啟動都重新加載就好了,下面輪到Swoole上場啦。
2 Swoole
Swoole是一個PHP擴展,使得PHP使用異步的方式執行,就像node一樣,而且還能使用socket,為PHP提供了一系列異步IO、事件驅動、並行數據結構功能。具體的安裝方法這就不說了,自己谷歌吧。
3 現有的輪子
搜搜github上已有的swoole啟動laravel的輪子,找了三個輪子
scil/LaravelFly
chongyi/swoole-laravel-framework
garveen/laravoole
用了LaravelFly,聽名字感覺感覺挺酷,結果不如人意,實在不喜歡它那種強硬的啟動方式。跟Laravel的風格-'優雅' 很不搭。於是又想自己寫,結果寫到一半發現laravoole這個項目有更新,然后啟動方式(使用artisan命令,沒更新前是用的bash腳本啟動),代碼風格都很酷,這不就是我想做的東西嘛!
chongyi/swoole-laravel-framework這個輪子是我在寫輪子的時候,作者在微信群里分享的,有興趣的朋友可以試試,我還沒試過。
4 LARAVOOLE中的幾個注意點
可以看看作者的文檔,我就只總結下我在用的過程中遇到的幾個點
1 你沒法不再使用一下的超全局變量,因為它們是WEB服務器創建的,而一個非熱啟動的項目使用他們可能會造成變量污染,你可以從Laravel的Request類中拿到你要的數據。
$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