上線清單 —— 20 個(gè) Laravel 應(yīng)用性能優(yōu)化項(xiàng)

file

讓我們開始吧闯参!假若你的 laravel 應(yīng)用已經(jīng)投入生產(chǎn)環(huán)境中塘砸。

從第一個(gè)用戶,到第十需五,第一百除呵,直到成千上萬的用戶唉锌!慢慢地,隨著用戶越多竿奏,你的網(wǎng)站會(huì)越來越慢

那我們應(yīng)該如何做袄简?細(xì)節(jié)決定成敗

經(jīng)過一番搜索,我決定寫下這20個(gè)使你網(wǎng)站提升速度的小提示

我將從基礎(chǔ)開始泛啸,大部分都是可以瞬間完成的操作绿语。然后,我將逐步提高難度。最后吕粹,就是更高級(jí)的內(nèi)容了种柑。如果你跟著我的步驟一步一步來,我相信你的網(wǎng)站會(huì)得到質(zhì)的提升匹耕。

享受你的學(xué)習(xí)之旅聚请!如果你有什么建議,可以在下方留言稳其!我很高興跟大家共同探討驶赏。

基礎(chǔ)的優(yōu)化項(xiàng)

讓我們看看我們能夠在短短幾秒鐘內(nèi)做些什么。

1. 路由緩存

每次服務(wù)器執(zhí)行請求時(shí)既鞠,都會(huì)注冊所有的路由煤傍,這會(huì)花費(fèi)一些時(shí)間。但是嘱蛋,你可以選擇緩存路由列表來跳過這個(gè)步驟蚯姆。

緩存路由列表是非常簡單的。你需要做的是在部署應(yīng)用程序后洒敏,執(zhí)行下面的這個(gè)命令:

php artisan route:cache

但是龄恋,如果你添加或修改了任意一個(gè)路由信息,請不要忘記清除之前的緩存以及重新執(zhí)行緩存命令凶伙。

php artisan route:clear

# 然后郭毕,再次執(zhí)行
php artisan route:cache

注意,這只對(duì)控制器類路由有效镊靴。

2. 緩存配置

就如路由一樣铣卡,你同樣可以在應(yīng)用中緩存配置文件链韭。

設(shè)想一下這種場景:每次你發(fā)送一個(gè)請求到 App 中偏竟,Laravel 都需要去加載不同的配置文件,并且要去打開.env 文件讀取其中的內(nèi)容敞峭。這種方式性能低下踊谋,是不?

不過不用擔(dān)心旋讹,這里有個(gè) Artisan 命令專治這個(gè)殖蚕。

php artisan config:cache

你在部署之后可以使用它。和路由差不多沉迹,別忘了編輯東西的時(shí)候清理一下緩存睦疫。

php artisan config:clear

# 然后,再來一次...
php artisan config:cache

3. 優(yōu)化 Composer 自動(dòng)加載

通常鞭呕,Composer 生成自動(dòng)加載文件非掣蛴快。但是,在生產(chǎn)環(huán)境中瓦糕,如果設(shè)置了PSR-4 和 PSR-0 自動(dòng)加載規(guī)則底洗,這可能會(huì)變慢。

您可以通過將下面命令添加到部署腳本來優(yōu)化自動(dòng)加載器文件創(chuàng)建過程咕娄。

$  composer dump-autoload  -o

不要忘記它亥揖。

4. 謠言:「不要大量使用 Blade 視圖」

這個(gè)謠言我都聽到頭大了。

"千萬不要大量使用 Blade 視圖圣勒,因?yàn)樗鼤?huì)使得應(yīng)用性能降低费变!"

徹頭徹尾的大謊言!認(rèn)真臉灾而!

銘記這個(gè):Laravel 編譯 Blade 視圖胡控。編譯就是說,在流程結(jié)束時(shí)旁趟,你將擁有一個(gè)已編譯的完整文件昼激,而非使用多個(gè)文件。

所以锡搜,絲毫不需要擔(dān)心橙困。


中級(jí)干貨

5. 換個(gè)其他/更好的 Cache/Session 驅(qū)動(dòng)

默認(rèn)的,當(dāng)你新建一個(gè) Laravel 項(xiàng)目的時(shí)候Cache 和 Sessions 的驅(qū)動(dòng)默認(rèn)為 「文件」耕餐。在本地開發(fā)環(huán)境和小項(xiàng)目中它沒啥問題凡傅,但是項(xiàng)目增長時(shí)事情就大條了。

所以肠缔,考慮下?lián)Q個(gè)更好的驅(qū)動(dòng)例如 Redis夏跷。 Laravel 有內(nèi)置支持它的方式,而你要做的就是 安裝 Predis明未。

更多細(xì)節(jié)在 這里此處槽华。

6. 盡快升級(jí) Laravel 版本

當(dāng)新版本發(fā)布時(shí),請記得盡快升級(jí) Laravel趟妥。這不僅關(guān)乎新功能:在可能的情況下猫态,所有貢獻(xiàn)者都花時(shí)間修復(fù)代碼庫周邊的性能問題。

所以披摄,要持續(xù)關(guān)注并保持代碼更新亲雪。

7. 刪除未使用的服務(wù)

這是很多人經(jīng)常忘記的小技巧,要向自己提問:

"我需要它嗎疚膊?*

我們知道 Laravel 自帶了很多服務(wù)义辕,畢竟,這是一個(gè)全椩⒌粒框架灌砖,每一個(gè)服務(wù)都有其用武之地夺巩。

所以,請花一些時(shí)間檢查 *config/app.php * 文件周崭,看看你是否能找到一個(gè)你不需要的服務(wù)柳譬。如果一切正常,請嘗試將其刪除并測試您的應(yīng)用程序续镇。

它應(yīng)該有所幫助(一點(diǎn)點(diǎn))美澳!

8. 使用預(yù)加載進(jìn)行查詢

如果你知道 Laravel 是什么,你可能也知道預(yù)加載是什么摸航。 如果您信息不夠及時(shí)制跟,預(yù)加載是一種通過使用特定語法來減少發(fā)送到數(shù)據(jù)庫的查詢數(shù)量來提高 Eloquent 性能的方法。

此問題稱為N + 1查詢問題酱虎。 讓我們舉個(gè)例子雨膨。 你有兩個(gè)模型:Book 和 Author。 每本 book 都有它的 author读串。

$books  =  App\Book::all();

foreach  ($books  as  $book)  {
    echo  $book->author->name;
}

想象一下聊记,您的數(shù)據(jù)庫中有1000本書。 現(xiàn)在恢暖,此代碼將執(zhí)行 ** 1001 ** 次查詢以檢索這1000本書的作者姓名排监。

1(查詢以獲取1000本書的數(shù)據(jù))+ 1000(查詢以獲取每本書的作者數(shù)據(jù))= 1001。

但是杰捂,如果你編寫這樣的代碼

$books  =  App\Book::with('author')->get();

foreach  ($books  as  $book)  {
    echo  $book->author->name;
}

更改基礎(chǔ)查詢以避免此性能問題舆床。 您將只執(zhí)行兩個(gè)查詢而不是1001! 這是巨大的性能提升嫁佳。

9. 緩存查詢結(jié)果

有時(shí)候挨队, 緩存一個(gè)具體的查詢結(jié)果可能是一個(gè)好主意。

想象這樣一個(gè)場景:你準(zhǔn)備在你的應(yīng)用主頁上展示 “十大專輯” 排行榜蒿往。 這項(xiàng)工作是通過從數(shù)據(jù)庫中執(zhí)行查詢完成的(查詢可能涉及到artists表以及其他的一些表)盛垦。 你的主頁訪問量是 1000 次/小時(shí) 。

如果這個(gè)排行榜數(shù)據(jù)的查詢次數(shù)是 1000次每小時(shí)熄浓,那么一天下來執(zhí)行的查詢次數(shù)就是24000次情臭。
現(xiàn)在省撑,讓我們假設(shè)這個(gè)排行榜是每小時(shí)更新一次 赌蔑。那么,將每次的查詢結(jié)果緩存一小時(shí)如何 竟秫?

$value  =  Cache::remember('top_10_albums',  60,  function  ()  {
    return  Album::with('artist',  'producer')->getTopTen();
});

這個(gè)緩存組件的 * remember* 方法在未找到緩存的情況下將會(huì)先從數(shù)據(jù)庫中獲取數(shù)據(jù)娃惯,并緩存60分鐘。到期后肥败,將會(huì)再次從數(shù)據(jù)庫中獲取最新的數(shù)據(jù)趾浅,更新緩存愕提。

查詢次數(shù) 從 24000 到 24 次/天 。

10. 為你的數(shù)據(jù)表建立索引

記住皿哨,必要的時(shí)候請為您的數(shù)據(jù)表建立索引浅侨。 這看起來像是個(gè)沒什么卵用的提示,但實(shí)際上這很有必要证膨。 因?yàn)槲乙娺^非常多的應(yīng)用如输,它們的數(shù)據(jù)表沒有索引。

實(shí)現(xiàn)起來很簡單央勒,您可以創(chuàng)建一個(gè)新的數(shù)據(jù)庫遷移并使用里面的方法來添加索引.

Schema::table('my_table_name',  function(Blueprint  $table){
    $table->index('field_to_be_indexed');
});

當(dāng)然不见,索引不是您喜歡在哪建就直接創(chuàng)建一個(gè)就是了。您必須研究您的業(yè)務(wù)崔步、代碼和查詢稳吮,去分析哪里才是最需要索引的地方,然后再建立索引井濒。

11. 中間件太多灶似?

Laravel 會(huì)對(duì)你注冊的中間件進(jìn)行大量的(前/后)調(diào)用。所以瑞你,請你仔細(xì)檢查它們喻奥,并且去掉那些你不需要的中間件。

通常中間件列表在 *Kernel.php *捏悬。

12. 是時(shí)候使用隊(duì)列了撞蚕!

有些時(shí)候,Laravel 比預(yù)期慢过牙,這時(shí)你可以考慮異步執(zhí)行任務(wù)甥厦。

最常見的情況就是發(fā)送一封歡迎郵件,讓我們一起看看任務(wù)流程寇钉。

  1. 用戶填寫我們的表單刀疙;
  2. 將他/她的詳細(xì)信息寫入數(shù)據(jù)庫;
  3. 發(fā)送一封寫有歡迎語和確認(rèn)鏈接的郵件給他/她;
  4. 并展示感謝頁面扫倡;

很多時(shí)候谦秧,這些任務(wù)完全是在控制器中并且按照順序執(zhí)行。

我的建議是學(xué)會(huì)如何使用事件和隊(duì)列撵溃,可以將發(fā)送郵件任務(wù)交給專門的流程疚鲤,以致于改善用戶使用體驗(yàn)。


高級(jí)干貨

13. 使用 Pusher 改進(jìn)異步隊(duì)列

上面我寫了一些跟隊(duì)列有關(guān)的內(nèi)容缘挑。有時(shí)集歇,你也可以使用隊(duì)列來改善面向用戶的任務(wù)。

想象一下语淘,你正在創(chuàng)建一個(gè)繁重的(在計(jì)算方面)進(jìn)程诲宇,并且希望給用戶顯示這個(gè)任務(wù)的進(jìn)度條际歼。你可以輕松地使用隊(duì)列的異步任務(wù)并集成 Pusher 來向前端發(fā)送消息以達(dá)到目的,即使這個(gè)任務(wù)沒有完成姑蓝。

另一個(gè)經(jīng)常使用的示例是向用戶發(fā)送消息不需要刷新頁面鹅心。

考慮一下吧!

14. 使用 Logs / Debugbars / Laravel Telescope 測量調(diào)試工具

在提升自己方面纺荧,有一句我自己非常喜歡的引用巴帮。是從我的 CEO (感謝 Massimo !)引用 Peter Drucker 的話那聽來的虐秋。

如果你無法衡量它榕茧,你就無法改進(jìn)它。

這個(gè)概念非常適合 Web 應(yīng)用程序的上下文客给。要想改善 Web 應(yīng)用的請求管理時(shí)間用押,需要測量很多東西。幸運(yùn)地靶剑,我們有許多非常優(yōu)秀的工具來完成這件事蜻拨。

  • 慢日志: MYSQL , MariaDB 和其他數(shù)據(jù)庫可以啟用慢日志來追蹤那些語句花了大量的時(shí)間桩引。你可以使用這些數(shù)據(jù)來判定是否必須更改或優(yōu)化特定的代碼(或查詢)缎讼;

  • Debugbar : Laravel Debugbar 是一個(gè)很棒的擴(kuò)展包。在很多應(yīng)用程序方面坑匠,你可以使用它來收集數(shù)據(jù)血崭。比如查詢,視圖厘灼,時(shí)間等等夹纫;

  • Laravel Telescope : 另一個(gè)非常酷的工具是 Laravel Telescope 设凹,對(duì) Laravel 應(yīng)用舰讹,有“優(yōu)雅的調(diào)試助手”的美稱。如果你感興趣闪朱, 我已經(jīng)在這里寫了一篇關(guān)于它的文章 月匣;

15. 更新你的PHP版本

雖然這看起來很簡單,但是如果你的項(xiàng)目夠大的話奋姿,這執(zhí)行起來會(huì)很麻煩锄开,所以我覺得把這條加入高級(jí)技巧里面。

如果你的 PHP 版本在7.0以下胀蛮,更新你的 PHP 和 laravel 版本院刁。

16. 在服務(wù)器上使用 Lumen

如果你的應(yīng)用程序數(shù)據(jù)量增長很大糯钙,你可以考慮為你的系統(tǒng)做服務(wù)拆分了粪狼。不過退腥,這并沒有一個(gè)明確的方法指南來引導(dǎo)你完成它:拆分標(biāo)準(zhǔn)的高與低取決于來自應(yīng)用程序的領(lǐng)域到拆分所有必需的內(nèi)容所需的工作中的許多因素。

但是再榄,一旦你拆分成功狡刘,你的項(xiàng)目將獲得新生。

如果你對(duì)這個(gè)主題感興趣的話困鸥,可以從 https://medium.com/@munza/large-scale-laravel-application-9d52c3d38e51 開始嗅蔬。

17. 為靜態(tài)資源提供 CDN 服務(wù)

我非常肯定你有很多前端的資源疾就,比如 CSS 文件和 JS 腳本澜术。

你可以通過多種方式來減少發(fā)送給用戶的數(shù)據(jù)量:

  • 壓縮靜態(tài)資源;
  • 捆綁靜態(tài)資源(將多個(gè) CSS 文件或者 JS 腳本合并為一個(gè),以減少請求次數(shù));
  • 開啟 gzip 壓縮;

然而猬腰,如果你遇到大量的流量鸟废,則你可以將你的靜態(tài)資源托管到專用的 CDN 服務(wù)器上,比如:

  • Akamai(阿卡邁);
  • Max CDN;
  • Cloudflare;
  • 亞馬遜 AWS 服務(wù) (S3 + CloudFront);

譯者注:國內(nèi)可以使用又拍云和七牛云

18. 使用高級(jí)測量工具

安裝 Laravel Debugbar 或 Telescope 將是一個(gè)良好的開端姑荷,但對(duì)于更重大的項(xiàng)目盒延,這還不夠。

你需要選擇更高級(jí)的工具鼠冕,如下:

  • New Relic;
  • AppOptics;
  • Datadog;
  • Sentry;

以上列表的應(yīng)用程序不做同樣的事情:他們被設(shè)計(jì)用于不同目的添寺。花些時(shí)間去學(xué)習(xí)他們以理解他們?nèi)绾翁峁椭?/p>

19. 垂直擴(kuò)展

你已經(jīng)對(duì)代碼的細(xì)枝末節(jié)都進(jìn)行了徹底優(yōu)化懈费,但是你的應(yīng)用體量在不斷增長计露。遲早你都要進(jìn)行垂直擴(kuò)展。

有個(gè)簡單的說法就是:更多的 RAM憎乙,更多的空間薄坏,更多的帶寬就,以及更多的 CPU

注意這個(gè)只是對(duì)許多沒有足夠時(shí)間來安排重構(gòu)/優(yōu)化的初創(chuàng)公司的通常做法寨闹。法子是不錯(cuò)胶坠,所以你可以認(rèn)為這是能讓你喘口氣的臨時(shí)解決方案。

20. 水平擴(kuò)展

水平擴(kuò)展是另一種擴(kuò)展的方式繁堡,它不同于傳統(tǒng)的垂直擴(kuò)展沈善,主要有兩點(diǎn):

  • 取代在現(xiàn)有配置上增加硬件資源的方式,你可能將會(huì)添加更多的功能模塊來處理日益增加的流量椭蹄。 在垂直擴(kuò)展的環(huán)境中闻牡,你只需要增加服務(wù)器配置就行,但是水平擴(kuò)展應(yīng)用就意味著你的應(yīng)用將會(huì)部署運(yùn)行在不同的機(jī)器上绳矩,有可能是在一個(gè)負(fù)載均衡機(jī)器或者其他服務(wù)之后罩润。這就意味著需要更多的設(shè)置和配置;此時(shí)事情就沒那么簡單了翼馆;
  • 并非所有的應(yīng)用都可以在短時(shí)間內(nèi)擴(kuò)展完畢割以,有時(shí)候你需要重構(gòu)隔離一些代碼金度;有時(shí)候你需要把應(yīng)用拆分為不同規(guī)模的小型服務(wù)。

水平擴(kuò)展會(huì)有有很多事情要做严沥,但是一旦你能對(duì)應(yīng)用進(jìn)行水平擴(kuò)展時(shí)猜极,好處也是超乎想象的。

結(jié)論

今天有足夠的內(nèi)容了消玄!我通過合并我的個(gè)人經(jīng)驗(yàn)和以前做過的一些研究創(chuàng)建了在這個(gè)列表跟伏。

如果你愿意,請盡管提出一些新東西翩瓜,我很樂意相應(yīng)更新一下此文章受扳。

轉(zhuǎn)自 https://learnku.com/laravel/t/24559

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市兔跌,隨后出現(xiàn)的幾起案子辞色,更是在濱河造成了極大的恐慌,老刑警劉巖浮定,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件相满,死亡現(xiàn)場離奇詭異,居然都是意外死亡桦卒,警方通過查閱死者的電腦和手機(jī)立美,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來方灾,“玉大人建蹄,你說我怎么就攤上這事≡3ィ” “怎么了洞慎?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長嘿棘。 經(jīng)常有香客問我劲腿,道長,這世上最難降的妖魔是什么鸟妙? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任焦人,我火速辦了婚禮,結(jié)果婚禮上重父,老公的妹妹穿的比我還像新娘花椭。我一直安慰自己,他們只是感情好房午,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布矿辽。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪袋倔。 梳的紋絲不亂的頭發(fā)上雕蔽,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音奕污,去河邊找鬼萎羔。 笑死液走,一個(gè)胖子當(dāng)著我的面吹牛碳默,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缘眶,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼嘱根,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巷懈?” 一聲冷哼從身側(cè)響起该抒,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顶燕,沒想到半個(gè)月后凑保,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡涌攻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年欧引,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恳谎。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芝此,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出因痛,到底是詐尸還是另有隱情婚苹,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布鸵膏,位于F島的核電站膊升,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谭企。R本人自食惡果不足惜用僧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赞咙。 院中可真熱鬧责循,春花似錦、人聲如沸攀操。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歹垫,卻和暖如春剥汤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背排惨。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工吭敢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人暮芭。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓鹿驼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辕宏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子畜晰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容