這裏參考 The 2018 Mighty Laravel Application 20 Optimization Ideas Checklist 列出提升 laravel 應用程式性能的 20 項目
[入門設定]
Route Caching
將 routes cache 可以讓server 更有效率的執行 request
php artisan route:cache
config caching
如同 routes cache,將.env設定內容進行快取,將可以提昇讀取效率
php artisan config:cache
若有修改 .env ,則建議先執行 clear 再執行 cache
php artisn config:clear
//接著執行
php artisan config:cache
優化 composer autoloader
雖然composer 執行 autoload 效率不錯,但是因為有使用 PSR-4 規則,則會減緩速度
因此,可以透過dump-autoload 產生優化 autoload file
composer dump-autoload -o
放心的使用 Blade
不必擔心 view 若過度的使用 blade 將會拖慢 compiles 速度,導致性能下降
和其他模板引擎不一樣的是,Laravel 的 template engines 會將 blade 進行編譯並且進行快取,直到下一次修改 blade 才會再被重新編譯,這意味著 blade 不會對你的系統造成負擔,可以放心的使用它。
[中級設定]
Cache/Session Driver
在 laravel 預設存取 session 以及 cache 的driver設定是 “file”
建議改用 redis (需安裝 predis)
盡快更新 Laravel 至最新版
通常新版本的 laravel 都會修正一些影響性能的 issue
刪除那些用不到的服務
請詢問自己,真的需要那些東西嗎?
檢視你的 config/app.php 查看是否有哪些 service provicer 是你用不到的
請嘗試依他移除,並且測試應用程式是否能正常運作
Eager Loading
Eager Loading 能夠提升 Eloquent 效率
常見的 N+1 query 問題,例如,在查詢 1000 本書,要取得所有作者名稱時
如果用以下方式,將會產生 1001 次 query
<?php
$books = App\Book::all();
foreach ($books as $book) {
echo $book->author->name;
}
用以下方式,則可以避免性能的問題
實際執行,只會用到 2 個 query
<?php
$books = App\Book::with('author')->get();
foreach ($books as $book) {
echo $book->author->name;
}
Cache Query 結果
有時,將 Query 結果進行 Cache 會是不錯的做法
例如,需要取得前 10 名的相簿,若每天擁有 24000 次的 request 次數
可以用這樣的方式,將查詢結果進行快取,快取時間設定在 60 分鐘,就能以 24 次 query 滿足這一天 24000 次的 request 訪問
<?php
$value = Cache::remember('top_10_albums', 60, function () {
return Album::with('artist', 'producer')->getTopTen();
});
Tables 加入索引 (index)
在製作 migration時,增加索引,將可以增進你查詢的效率
<?php
Schema::table('my_table_name', function(Blueprint $table){
$table->index('field_to_be_indexed');
});
避免過度使用 Middleware
Laravel 每次在執行時,都會呼叫已註冊的 middleware
所以,請檢查目前的 middleware是不是必須的,
如果要檢查 middleware ,可以透過 Kernel.php 檔案來查閱
使用 Queues 的時機
有時,Laravel 在執行某些事件,會需要耗掉一些時間
這時可以透過非同步任務的方式來處理,例如發送 email ,來提升使用者的體驗
[進階設定]
使用 pusher 來做非同步任務處理
想像一下,現在你如果要執行一個非常大量的處理程序,例如,同時發送大量的簡訊
這時就能簡易的透過非同步的 job 來排設 queue
以及結合 pusher 來發送訊息
善用 Logs / Debugbars / Laravel Telescope
在調測性能或者測試過程,可以透過 Logs / Debugbars / Laravel Telescope 來監看
例如,檢測資料庫查詢的時間是否過慢,確認 query 請求次數,
特別一提的是,可善用 laravel application - Laravel Telescope ,這是一套優雅的debug 助理工具
You can’t improve it if you can’t measure it.
更新 php 版本
7.* 絕對是必要
考慮使用 Lumen 建構服務
如果應用程式有大幅度的增長,考慮開始將服務進行分離時,可以考慮使用 lumen 來開發
CDN
若系統服務大到一個規模,則推薦使用CDN 服務
底下是一些知名的 CDN 服務商,供參考:
Akamai Max CDN; Cloudflare; Amazon AWS Services (S3 + CloudFront);
使用進階的量測工具
前面所提到的 Laravel Debugbar or Telescope 都是不錯的開始
但其實還有一些進階的量測工具,例如: New Relic; AppOptics; Datadog; Sentry;
Vertical 規模
前面,雖然已經優化了代碼,但是當網站規模不斷擴大,適當的增加RAM, 儲存空間, 頻寬, CPU 都可即刻解決一些問題
即單位主機所需的基本規模,還是要配得恰當才行,並且是不同時間點調整方案
Horizontal 規模
有別於傳統的 Vertical 規模設定,Horizontal 規模注重的是分散式的管理流量及風險
以多台主機方式,做 load balancer 來將性能提升到更好的層次
但是,很少的程式碼會在一開始就考量到水平規模,因此,在實際做 load balancer時,會遇到需要適當裁切你的 code ,或製作成多個微服務,來因應主機策略