摘要:此問(wèn)題稱為查詢問(wèn)題。您將只執(zhí)行兩個(gè)查詢而不是這是巨大的性能提升。這項(xiàng)工作是通過(guò)從數(shù)據(jù)庫(kù)中執(zhí)行查詢完成的查詢可能涉及到表以及其他的一些表。比如查詢,視圖,時(shí)間等等另一個(gè)非常酷的工具是,對(duì)應(yīng)用,有優(yōu)雅的調(diào)試助手的美稱。
讓我們開始吧!假若你的 laravel 應(yīng)用已經(jīng)投入生產(chǎn)環(huán)境中。
從第一個(gè)用戶,到第十,第一百,直到成千上萬(wàn)的用戶!慢慢地,隨著用戶越多,你的網(wǎng)站會(huì)越來(lái)越慢
那我們應(yīng)該如何做?細(xì)節(jié)決定成敗
經(jīng)過(guò)一番搜索,我決定寫下這20個(gè)使你網(wǎng)站提升速度的小提示
我將從基礎(chǔ)開始,大部分都是可以瞬間完成的操作。然后,我將逐步提高難度。最后,就是更高級(jí)的內(nèi)容了。如果你跟著我的步驟一步一步來(lái),我相信你的網(wǎng)站會(huì)得到質(zhì)的提升。
享受你的學(xué)習(xí)之旅!如果你有什么建議,可以在下方留言!我很高興跟大家共同探討。
基礎(chǔ)的優(yōu)化項(xiàng)讓我們看看我們能夠在短短幾秒鐘內(nèi)做些什么。
1. 路由緩存每次服務(wù)器執(zhí)行請(qǐng)求時(shí),都會(huì)注冊(cè)所有的路由,這會(huì)花費(fèi)一些時(shí)間。但是,你可以選擇緩存路由列表來(lái)跳過(guò)這個(gè)步驟。
緩存路由列表是非常簡(jiǎn)單的。你需要做的是在部署應(yīng)用程序后,執(zhí)行下面的這個(gè)命令:
php artisan route:cache
但是,如果你添加或修改了任意一個(gè)路由信息,請(qǐng)不要忘記清除之前的緩存以及重新執(zhí)行緩存命令。
php artisan route:clear # 然后,再次執(zhí)行 php artisan route:cache
注意,這只對(duì)控制器類路由有效。
2. 緩存配置就如路由一樣,你同樣可以在應(yīng)用中緩存配置文件。
設(shè)想一下這種場(chǎng)景:每次你發(fā)送一個(gè)請(qǐng)求到 App 中,Laravel 都需要去加載不同的配置文件,并且要去打開.env?文件讀取其中的內(nèi)容。這種方式性能低下,是不?
不過(guò)不用擔(dān)心,這里有個(gè) Artisan 命令專治這個(gè)。
php artisan config:cache
你在部署之后可以使用它。和路由差不多,別忘了編輯東西的時(shí)候清理一下緩存。
php artisan config:clear # 然后,再來(lái)一次... php artisan config:cache3. 優(yōu)化 Composer 自動(dòng)加載
通常,Composer 生成自動(dòng)加載文件非常快。但是,在生產(chǎn)環(huán)境中,如果設(shè)置了PSR-4 和 PSR-0 自動(dòng)加載規(guī)則,這可能會(huì)變慢。
您可以通過(guò)將下面命令添加到部署腳本來(lái)優(yōu)化自動(dòng)加載器文件創(chuàng)建過(guò)程。
$ composer dump-autoload -o
不要忘記它。
4. 謠言:「不要大量使用 Blade 視圖」這個(gè)謠言我都聽到頭大了。
"千萬(wàn)不要大量使用 Blade 視圖,因?yàn)樗鼤?huì)使得應(yīng)用性能降低!"
徹頭徹尾的大謊言!認(rèn)真臉!
銘記這個(gè):Laravel 編譯 Blade 視圖。編譯就是說(shuō),在流程結(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)目中它沒(méi)啥問(wèn)題,但是項(xiàng)目增長(zhǎng)時(shí)事情就大條了。
所以,考慮下?lián)Q個(gè)更好的驅(qū)動(dòng)例如 Redis。 Laravel 有內(nèi)置支持它的方式,而你要做的就是?安裝 Predis。
更多細(xì)節(jié)在?這里和?此處。
6. 盡快升級(jí) Laravel 版本當(dāng)新版本發(fā)布時(shí),請(qǐng)記得盡快升級(jí) Laravel。這不僅關(guān)乎新功能:在可能的情況下,所有貢獻(xiàn)者都花時(shí)間修復(fù)代碼庫(kù)周邊的性能問(wèn)題。
所以,要持續(xù)關(guān)注并保持代碼更新。
7. 刪除未使用的服務(wù)這是很多人經(jīng)常忘記的小技巧,要向自己提問(wèn):
"我需要它嗎?*
我們知道 Laravel 自帶了很多服務(wù),畢竟,這是一個(gè)全棧框架,每一個(gè)服務(wù)都有其用武之地。
所以,請(qǐng)花一些時(shí)間檢查 config/app.php? 文件,看看你是否能找到一個(gè)你不需要的服務(wù)。如果一切正常,請(qǐng)嘗試將其刪除并測(cè)試您的應(yīng)用程序。
它應(yīng)該有所幫助(一點(diǎn)點(diǎn))!
8. 使用預(yù)加載進(jìn)行查詢如果你知道 Laravel 是什么,你可能也知道預(yù)加載是什么。 如果您信息不夠及時(shí),預(yù)加載是一種通過(guò)使用特定語(yǔ)法來(lái)減少發(fā)送到數(shù)據(jù)庫(kù)的查詢數(shù)量來(lái)提高 Eloquent 性能的方法。
此問(wèn)題稱為N + 1查詢問(wèn)題。 讓我們舉個(gè)例子。 你有兩個(gè)模型:Book 和 Author。 每本 book 都有它的 author。
$books = AppBook::all(); foreach ($books as $book) { ????echo $book->author->name; }
想象一下,您的數(shù)據(jù)庫(kù)中有1000本書。 現(xiàn)在,此代碼將執(zhí)行 1001 次查詢以檢索這1000本書的作者姓名。
1(查詢以獲取1000本書的數(shù)據(jù))+ 1000(查詢以獲取每本書的作者數(shù)據(jù))= 1001。
但是,如果你編寫這樣的代碼
$books = AppBook::with("author")->get(); foreach ($books as $book) { ????echo $book->author->name; }
更改基礎(chǔ)查詢以避免此性能問(wèn)題。 您將只執(zhí)行兩個(gè)查詢而不是1001! 這是巨大的性能提升。
9. 緩存查詢結(jié)果有時(shí)候, 緩存一個(gè)具體的查詢結(jié)果可能是一個(gè)好主意。
想象這樣一個(gè)場(chǎng)景:你準(zhǔn)備在你的應(yīng)用主頁(yè)上展示 “十大專輯” 排行榜。 這項(xiàng)工作是通過(guò)從數(shù)據(jù)庫(kù)中執(zhí)行查詢完成的(查詢可能涉及到artists表以及其他的一些表)。 你的主頁(yè)訪問(wèn)量是 1000 次/小時(shí) 。
如果這個(gè)排行榜數(shù)據(jù)的查詢次數(shù)是 1000次每小時(shí),那么一天下來(lái)執(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ù)庫(kù)中獲取數(shù)據(jù),并緩存60分鐘。到期后,將會(huì)再次從數(shù)據(jù)庫(kù)中獲取最新的數(shù)據(jù),更新緩存。
查詢次數(shù) 從 24000 到 24 次/天 。
10. 為你的數(shù)據(jù)表建立索引記住,必要的時(shí)候請(qǐng)為您的數(shù)據(jù)表建立索引。 這看起來(lái)像是個(gè)沒(méi)什么卵用的提示,但實(shí)際上這很有必要。 因?yàn)槲乙娺^(guò)非常多的應(yīng)用,它們的數(shù)據(jù)表沒(méi)有索引。
實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,您可以創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù)遷移并使用里面的方法來(lái)添加索引.
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ì)你注冊(cè)的中間件進(jìn)行大量的(前/后)調(diào)用。所以,請(qǐng)你仔細(xì)檢查它們,并且去掉那些你不需要的中間件。
通常中間件列表在?Kernel.php?。
12. 是時(shí)候使用隊(duì)列了!有些時(shí)候,Laravel 比預(yù)期慢,這時(shí)你可以考慮異步執(zhí)行任務(wù)。
最常見的情況就是發(fā)送一封歡迎郵件,讓我們一起看看任務(wù)流程。
用戶填寫我們的表單;
將他/她的詳細(xì)信息寫入數(shù)據(jù)庫(kù);
發(fā)送一封寫有歡迎語(yǔ)和確認(rèn)鏈接的郵件給他/她;
并展示感謝頁(yè)面;
很多時(shí)候,這些任務(wù)完全是在控制器中并且按照順序執(zhí)行。
我的建議是學(xué)會(huì)如何使用事件和隊(duì)列,可以將發(fā)送郵件任務(wù)交給專門的流程,以致于改善用戶使用體驗(yàn)。
*
高級(jí)干貨 13. 使用 Pusher 改進(jìn)異步隊(duì)列上面我寫了一些跟隊(duì)列有關(guān)的內(nèi)容。有時(shí),你也可以使用隊(duì)列來(lái)改善面向用戶的任務(wù)。
想象一下,你正在創(chuàng)建一個(gè)繁重的(在計(jì)算方面)進(jìn)程,并且希望給用戶顯示這個(gè)任務(wù)的進(jìn)度條。你可以輕松地使用隊(duì)列的異步任務(wù)并集成 Pusher 來(lái)向前端發(fā)送消息以達(dá)到目的,即使這個(gè)任務(wù)沒(méi)有完成。
另一個(gè)經(jīng)常使用的示例是向用戶發(fā)送消息不需要刷新頁(yè)面。
考慮一下吧!
14. 使用 Logs / Debugbars / Laravel Telescope 測(cè)量調(diào)試工具在提升自己方面,有一句我自己非常喜歡的引用。是從我的 CEO (感謝 Massimo !)引用 Peter Drucker 的話那聽來(lái)的。
如果你無(wú)法衡量它,你就無(wú)法改進(jìn)它。
這個(gè)概念非常適合 Web 應(yīng)用程序的上下文。要想改善 Web 應(yīng)用的請(qǐng)求管理時(shí)間,需要測(cè)量很多東西。幸運(yùn)地,我們有許多非常優(yōu)秀的工具來(lái)完成這件事。
慢日志: MYSQL , MariaDB 和其他數(shù)據(jù)庫(kù)可以啟用慢日志來(lái)追蹤那些語(yǔ)句花了大量的時(shí)間。你可以使用這些數(shù)據(jù)來(lái)判定是否必須更改或優(yōu)化特定的代碼(或查詢);
Debugbar : Laravel Debugbar 是一個(gè)很棒的擴(kuò)展包。在很多應(yīng)用程序方面,你可以使用它來(lái)收集數(shù)據(jù)。比如查詢,視圖,時(shí)間等等;
Laravel Telescope : 另一個(gè)非常酷的工具是 Laravel Telescope ,對(duì) Laravel 應(yīng)用,有“優(yōu)雅的調(diào)試助手”的美稱。如果你感興趣, 我已經(jīng)在這里寫了一篇關(guān)于它的文章 ;
15. 更新你的PHP版本雖然這看起來(lái)很簡(jiǎn)單,但是如果你的項(xiàng)目夠大的話,這執(zhí)行起來(lái)會(huì)很麻煩,所以我覺(jué)得把這條加入高級(jí)技巧里面。
如果你的 PHP 版本在7.0以下,更新你的 PHP 和 laravel 版本。
16. 在服務(wù)器上使用 Lumen如果你的應(yīng)用程序數(shù)據(jù)量增長(zhǎng)很大,你可以考慮為你的系統(tǒng)做服務(wù)拆分了。不過(guò),這并沒(méi)有一個(gè)明確的方法指南來(lái)引導(dǎo)你完成它:拆分標(biāo)準(zhǔn)的高與低取決于來(lái)自應(yīng)用程序的領(lǐng)域到拆分所有必需的內(nèi)容所需的工作中的許多因素。
但是,一旦你拆分成功,你的項(xiàng)目將獲得新生。
如果你對(duì)這個(gè)主題感興趣的話,可以從 ?https://medium.com/@munza/lar... 開始。
17. 為靜態(tài)資源提供 CDN 服務(wù)我非常肯定你有很多前端的資源,比如 CSS 文件和 JS 腳本。
你可以通過(guò)多種方式來(lái)減少發(fā)送給用戶的數(shù)據(jù)量:
壓縮靜態(tài)資源;
捆綁靜態(tài)資源(將多個(gè) CSS 文件或者 JS 腳本合并為一個(gè),以減少請(qǐng)求次數(shù));
開啟 gzip 壓縮;
然而,如果你遇到大量的流量,則你可以將你的靜態(tài)資源托管到專用的 CDN 服務(wù)器上,比如:
Akamai(阿卡邁);
Max CDN;
Cloudflare;
亞馬遜 AWS 服務(wù) (S3 + CloudFront);
譯者注:國(guó)內(nèi)可以使用又拍云和七牛云18. 使用高級(jí)測(cè)量工具
安裝 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)用體量在不斷增長(zhǎng)。遲早你都要進(jìn)行垂直擴(kuò)展。
有個(gè)簡(jiǎn)單的說(shuō)法就是:更多的 RAM,更多的空間,更多的帶寬就,以及更多的 CPU
注意這個(gè)只是對(duì)許多沒(méi)有足夠時(shí)間來(lái)安排重構(gòu)/優(yōu)化的初創(chuàng)公司的通常做法。法子是不錯(cuò),所以你可以認(rèn)為這是能讓你喘口氣的臨時(shí)解決方案。
20. 水平擴(kuò)展水平擴(kuò)展是另一種擴(kuò)展的方式,它不同于傳統(tǒng)的垂直擴(kuò)展,主要有兩點(diǎn):
取代在現(xiàn)有配置上增加硬件資源的方式,你可能將會(huì)添加更多的功能模塊來(lái)處理日益增加的流量。 在垂直擴(kuò)展的環(huán)境中,你只需要增加服務(wù)器配置就行,但是水平擴(kuò)展應(yīng)用就意味著你的應(yīng)用將會(huì)部署運(yùn)行在不同的機(jī)器上,有可能是在一個(gè)負(fù)載均衡機(jī)器或者其他服務(wù)之后。這就意味著需要更多的設(shè)置和配置;此時(shí)事情就沒(méi)那么簡(jiǎn)單了;
并非所有的應(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)容了!我通過(guò)合并我的個(gè)人經(jīng)驗(yàn)和以前做過(guò)的一些研究創(chuàng)建了在這個(gè)列表。
如果你愿意,請(qǐng)盡管提出一些新東西,我很樂(lè)意相應(yīng)更新一下此文章。
轉(zhuǎn)自 https://learnku.com/laravel/t...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/30189.html
摘要:我最近研究分析了在上面創(chuàng)建的項(xiàng)目的性能。經(jīng)過(guò)查閱更多資料和研究,發(fā)現(xiàn)一個(gè)可能明顯改善的性能問(wèn)題。在這個(gè)檢查的過(guò)程中任何的遲鈍都會(huì)成為整個(gè)項(xiàng)目的性能瓶頸。過(guò)濾集合類過(guò)濾權(quán)限集合的方法被認(rèn)為是造成低性能的原因。使用代替可以提高的性能。 showImg(https://segmentfault.com/img/remote/1460000015273870); 我最近研究分析了在?SWIS上...
摘要:為了一探究竟,于是開啟了這次應(yīng)用性能調(diào)優(yōu)之旅。使用即時(shí)編譯器和都能輕輕松松的讓你的應(yīng)用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結(jié)。在經(jīng)歷了調(diào)優(yōu)過(guò)程踩的很多坑之后,我們最終完善并實(shí)施了初步的性能測(cè)試方案,通過(guò)真實(shí)的測(cè)試數(shù)據(jù)歸納出了 Laravel 開發(fā)過(guò)程中的一些實(shí)踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應(yīng)用程序響應(yīng)有點(diǎn)慢、20幾個(gè)并...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
平日學(xué)習(xí)接觸過(guò)的網(wǎng)站積累,以每月的形式發(fā)布。2017年以前看這個(gè)網(wǎng)址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進(jìn)擊的 Promise Effective JavaScript leeheys blog -...
閱讀 1050·2021-11-22 13:53
閱讀 1600·2021-11-17 09:33
閱讀 2403·2021-10-14 09:43
閱讀 2866·2021-09-01 11:41
閱讀 2280·2021-09-01 10:44
閱讀 2922·2021-08-31 09:39
閱讀 1457·2019-08-30 15:44
閱讀 1866·2019-08-30 13:02