這裏參考 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 ,或製作成多個微服務,來因應主機策略