Laravel 9 保姆級(jí)視頻教程,想學(xué)不會(huì)都難!進(jìn)入學(xué)習(xí)
Laravel 是一個(gè)流行的開(kāi)源 PHP 框架,以其強(qiáng)大的安全性和簡(jiǎn)單而復(fù)雜的編碼架構(gòu)而聞名。它是構(gòu)建能夠推動(dòng)收入和推動(dòng)業(yè)務(wù)發(fā)展的尖端 Web 應(yīng)用程序的絕佳選擇。
如今,沒(méi)有一個(gè) PHP 開(kāi)發(fā)人員不受 Laravel 的影響。他們要么是喜歡 Laravel 提供的快速開(kāi)發(fā)的初級(jí)或中級(jí)開(kāi)發(fā)人員,要么是由于市場(chǎng)壓力而被迫學(xué)習(xí) Laravel 的高級(jí)開(kāi)發(fā)人員。
擁有超過(guò) 100 萬(wàn)個(gè)由 Laravel 提供支持的網(wǎng)站,谷歌推動(dòng)了網(wǎng)站速度的重要性,除了令人難以置信的流暢用戶(hù)體驗(yàn)之外,用戶(hù)越來(lái)越不接受任何其他東西 ,有些人正在給 PHP 和 Laravel 等框架提供性能不如其他框架的聲譽(yù)構(gòu)架。雖然這很可能是事實(shí),但這并不意味著你對(duì)此無(wú)能為力。因此,在本指南中,我們將深入探討如何優(yōu)化 Laravel 的性能。
目前,Laravel 已經(jīng)成為開(kāi)發(fā)商業(yè)和電子商務(wù)應(yīng)用程序的一個(gè)非常流行的框架。大多數(shù)組織都喜歡用 Laravel 來(lái)構(gòu)建他們的業(yè)務(wù)應(yīng)用程序。原因有很多。但是今天我們只關(guān)注性能優(yōu)化。
Laravel 的性能優(yōu)化為何如此重要?
這篇文章將介紹幾個(gè)重要的技巧,每個(gè)步驟指導(dǎo)優(yōu)化你的 Laravel 網(wǎng)站。雖然有些步驟可能聽(tīng)起來(lái)很有技術(shù)含量,但這些步驟很容易遵循并在你自己的屏幕上重新創(chuàng)建。
1. 路由緩存
Laravel 允許緩存路由。你可以執(zhí)行 Artisan 命令:
php artisan route:cache
所有的路由都會(huì)緩存在 routes.php
文件中。
下次需要路由時(shí),將訪問(wèn)緩存而不是路由文件。這可以通過(guò)快速路由請(qǐng)求來(lái)提高站點(diǎn)性能。
要清除緩存,可以使用類(lèi)似的命令:
php artisan route:clear
路由緩存是一種可以讓你的網(wǎng)站更流暢、加載更快的簡(jiǎn)單方法。
2. 有效的使用 Artisan 命令
Laravel 最好的特性之一是它的命令行工具 Artisan 。如果有效地使用它,可以提高應(yīng)用程序的性能。
你可以緩存路由和配置。你可以執(zhí)行下面的命令來(lái)緩存配置和路由:
php artisan config:cache php artisan route:cache
Note: Artisan Optimize 在 Laravel 5.5 中被移除,在之前的版本中可以工作。
php artisan optimize --force
在添加新配置或新路由時(shí),一定要記得清除緩存??梢允褂孟旅娴拿钣行У厍宄彺?。
php artisan config:clear php artisan route:cache php artisan view:clear
3. 配置緩存
Laravel 提供了一個(gè)非常有趣的命令:Artisan Cache Config
,它對(duì)提升性能非常有幫助。命令的基本用法是:
php artisan config:cache
緩存配置后,不會(huì)對(duì)你所做的更改產(chǎn)生任何影響。 如果你想刷新配置,只需再次運(yùn)行上述命令。如果需要清除配置緩存,請(qǐng)使用以下命令:
php artisan config:clear
4. 直接獲取數(shù)據(jù)
當(dāng)你在 Laravel 中執(zhí)行任何查詢(xún)時(shí),Laravel會(huì)延遲執(zhí)行該查詢(xún)(懶加載),它僅在需要時(shí)獲取數(shù)據(jù)。
在某些情況下,這種延遲加載行為會(huì)增加執(zhí)行的查詢(xún)數(shù),同時(shí)會(huì)降低應(yīng)用程序的性能。
讓我們看一個(gè)簡(jiǎn)單的例子來(lái)詳細(xì)了解這種行為。 如果你想獲取圖書(shū)館中書(shū)籍的作者姓名。
使用延遲加載,你最終將執(zhí)行 N+1 個(gè)查詢(xún)來(lái)查找結(jié)果。 你可以從下面的代碼示例中看到它。
$books = Book::all();foreach ($books as $book) { echo $book->author->name;}
在下面的代碼中,每次執(zhí)行 for 循環(huán)時(shí),都會(huì)執(zhí)行查詢(xún)。 為了解決這個(gè)問(wèn)題,Laravel 允許你直接加載數(shù)據(jù)。
這會(huì)增加你的查詢(xún)執(zhí)行時(shí)間并減少查詢(xún)數(shù)量。 下面的代碼示例展示了我們?nèi)绾卧谝粋€(gè)查詢(xún)中輕松加載完整列表。
$books = Book::with('author')->get();foreach ($books as $book) { echo $book->author->name;}
讓我們看一個(gè)簡(jiǎn)單的例子來(lái)詳細(xì)了解這種行為。
如果想獲取圖書(shū)館中書(shū)籍的作者姓名。
如果不使用預(yù)先加載,最終將執(zhí)行 N+1 個(gè)查詢(xún)來(lái)查找結(jié)果。
你可以從下面的代碼示例中看到它。
$books = Book::all();foreach ($books as $book) { echo $book->author->name;}
在下面的代碼中,每次執(zhí)行 for 循環(huán)時(shí),都會(huì)執(zhí)行一次查詢(xún)。
為了解決這個(gè)問(wèn)題,Laravel 允許預(yù)先加載關(guān)聯(lián)數(shù)據(jù)。
這會(huì)增加的查詢(xún)執(zhí)行時(shí)間并減少查詢(xún)次數(shù)。
下面的代碼示例展示了我們?nèi)绾卧谝粋€(gè)查詢(xún)中輕松加載完整列表。
$books = Book::with('author')->get();foreach ($books as $book) { echo $book->author->name;}
5. Composer 優(yōu)化
Laravel 使用一個(gè)名為 Composer 的包管理工具來(lái)管理不同的依賴(lài)項(xiàng)。 當(dāng)你最初安裝 Composer 時(shí),默認(rèn)情況下它會(huì)將開(kāi)發(fā)依賴(lài)項(xiàng)加載到你的系統(tǒng)中。
這些依賴(lài)項(xiàng)對(duì)于開(kāi)發(fā)網(wǎng)站很有用。 但是,一旦你的網(wǎng)站完全投入運(yùn)營(yíng),就不再需要它們,事實(shí)上,它們只會(huì)減慢速度。
當(dāng)使用 Composer 安裝包時(shí),使用 --no-dev
和 -o
參數(shù)來(lái)移除 dev 依賴(lài):
composer install --prefer-dist --no-dev -o
此命令允許 Composer 創(chuàng)建用于優(yōu)化自動(dòng)加載器和提高性能的目錄。 它只是請(qǐng)求獲取和打包官方發(fā)行版,沒(méi)有開(kāi)發(fā)依賴(lài)項(xiàng)。
注意不要消除任何運(yùn)行時(shí)依賴(lài)項(xiàng)。 這可能會(huì)危及網(wǎng)站的性能,甚至導(dǎo)致其崩潰。
6. 壓縮綁定配置
Laravel mix 可以在這里為你提供幫助,它編譯所有 CSS 并提供單個(gè) app.css
文件,從而將多個(gè) HTTP 請(qǐng)求減少為單個(gè)。 你還可以使用 laravel-mix-purgecss 包從項(xiàng)目中刪除未使用的 CSS,只需將其安裝在你的開(kāi)發(fā)項(xiàng)目中:
npm install laravel-mix-purgecss --save-dev # or yarn add laravel-mix-purgecss --dev
在你的文件 webpack.mix.js
中
const mix = require('laravel-mix');require('laravel-mix-purgecss');mix.js('resources/js/app.js', 'public/js').sass('resources/sass/app.scss', 'public/css').purgeCss();
7. 隊(duì)列
Laravel 隊(duì)列就像你的 CPU 一樣工作。 每當(dāng)你的計(jì)算機(jī)處理一項(xiàng)任務(wù)時(shí),它都會(huì)以最有效的方式執(zhí)行,而不會(huì)降低用戶(hù)體驗(yàn)的質(zhì)量。 這意味著當(dāng)你渲染文件或執(zhí)行資源密集型操作時(shí),你的 CPU 會(huì)確保你仍有剩余的處理能力用于其他任務(wù),直到達(dá)到其限制。
例如,當(dāng)用戶(hù)注冊(cè)到網(wǎng)站時(shí),我們必須在后端執(zhí)行許多操作,例如存儲(chǔ)用戶(hù)信息、發(fā)送激活郵件、發(fā)送歡迎郵件等。如果我們只是發(fā)送一封郵件(沒(méi)有隊(duì)列),那么它會(huì)大約需要 4-5 秒。并且用戶(hù)必須等到請(qǐng)求。因此,對(duì)于隊(duì)列,我們只需要在執(zhí)行所需的驗(yàn)證并顯示用戶(hù)成功消息后將操作推送到隊(duì)列中。之后,我們只需要在隊(duì)列執(zhí)行時(shí)處理基本的事務(wù)。
簡(jiǎn)單的例子是:
- 發(fā)送電子郵件
- 下載文件
- 上傳文件
這些任務(wù)不需要用戶(hù)看到,可以作為后臺(tái)進(jìn)程完成。
Laravel 還有幾個(gè)隊(duì)列驅(qū)動(dòng)程序支持文檔,并為每個(gè)文檔提供獨(dú)特的解決方案,例如 Horizon,一個(gè)監(jiān)控隊(duì)列系統(tǒng)的儀表板。
8. 快速緩存或會(huì)話(huà)驅(qū)動(dòng)程序
為了提高 Laravel 應(yīng)用程序的性能,我們可以存儲(chǔ)會(huì)話(huà)并將它們緩存在 RAM 中。 Memcached 是最好和最快的緩存和會(huì)話(huà)驅(qū)動(dòng)程序。 Laravel 可以靈活地將一個(gè)緩存/會(huì)話(huà)驅(qū)動(dòng)器切換到另一個(gè)。
對(duì)于會(huì)話(huà)驅(qū)動(dòng),我們可以在 config/session.php
中更改驅(qū)動(dòng)鍵,對(duì)于緩存,我們可以在 config/cache.php
文件中更改驅(qū)動(dòng)鍵。
9. 數(shù)據(jù)庫(kù)索引
當(dāng)我們談?wù)撎岣邞?yīng)用程序的性能時(shí),我們會(huì)遵循 Laravel 中的許多實(shí)踐,例如緩存、數(shù)據(jù)加載、資產(chǎn)縮小等。但是還有一件事可以幫助我們提高性能,即數(shù)據(jù)庫(kù)索引。 這基本上是一種數(shù)據(jù)庫(kù)級(jí)技術(shù)。
在技術(shù)實(shí)現(xiàn)的角度看,數(shù)據(jù)庫(kù)索引是基于數(shù)據(jù)庫(kù)表的一個(gè)或多個(gè)列的數(shù)據(jù)結(jié)構(gòu)。索引背后的主要思想是加快數(shù)據(jù)檢索。它有助于輕松定位數(shù)據(jù),而無(wú)需在每次訪問(wèn)數(shù)據(jù)庫(kù)時(shí)遍歷每一行。
使用列,索引有助于最小化處理的每個(gè)查詢(xún)的磁盤(pán)訪問(wèn)。使數(shù)據(jù)庫(kù)索引成為一種強(qiáng)大的數(shù)據(jù)庫(kù)優(yōu)化技術(shù)還可以提高數(shù)據(jù)庫(kù)的整體性能。
在 Laravel 中,我們可以使用遷移來(lái)創(chuàng)建索引。下面是示例:
Schema::create(‘users’, function (Blueprint $table) { $table->string(’email’)->index();});
10. 利用 JIT 編譯器
PHP 是一種計(jì)算機(jī)機(jī)器和服務(wù)器端語(yǔ)言。它本身不理解 PHP 代碼。通常,程序員使用編譯器將代碼編譯成字節(jié)碼并解釋 PHP 代碼。程序編譯過(guò)程會(huì)影響 Laravel 應(yīng)用程序的性能和用戶(hù)體驗(yàn)。所以,Laravel 程序員可以使用 Zend Engine 自帶的即時(shí)編譯器來(lái)快速編譯代碼。
11. 壓縮圖像
如果你的項(xiàng)目中包含許多圖像,你應(yīng)該壓縮所有圖像以?xún)?yōu)化性能。
有一些方法可以進(jìn)行優(yōu)化。
但是不同的圖像需要不同的工具來(lái)保持圖像的質(zhì)量和分辨率。
如果你使用 Laravel Mix,建議在編譯圖像時(shí)使用像 ImageMin 這樣的 NPM 包。
對(duì)于非常大的圖片,先試試 TinyPNG 壓縮圖片,然后再用 ImageMin 盡量壓縮。
12. 視圖緩存
另一個(gè)方面是視圖緩存。
視圖緩存存儲(chǔ)編譯后的的 Blade 模板以提高項(xiàng)目的速度。
你可以使用下面的 artisan 命令手動(dòng)編譯所有視圖并優(yōu)化性能:
php artisan view:cache
上傳新代碼時(shí)記得清除緩存;否則,Laravel 將使用你的舊視圖,你將花費(fèi)大量時(shí)間嘗試解決此問(wèn)題。運(yùn)行以下命令清除視圖緩存:
php artisan view:clear
13. 刪除未使用的服務(wù)
你可以使用 Laravel 提供的服務(wù)容器框架輕松地注入服務(wù)。你只需在 config/app.php
文件中的 providers[]
數(shù)組中添加服務(wù)的名稱(chēng)。
但同時(shí),你應(yīng)該只打開(kāi)你正在使用的那些服務(wù)。應(yīng)停止所有其他未使用的服務(wù)。
你可以通過(guò)在 config/app.php 文件中注釋掉這些服務(wù)來(lái)停止這些服務(wù)。這將減少你的應(yīng)用程序啟動(dòng)所需的時(shí)間并提高其性能
14. 使用 CDN 加載靜態(tài)內(nèi)容
CDN 是在全球范圍內(nèi)加載靜態(tài)內(nèi)容的好方法。如果你的應(yīng)用程序越來(lái)越流行,你可能需要為你的應(yīng)用程序使用 CDN 服務(wù)
讓我舉一個(gè)簡(jiǎn)單的例子,你在美國(guó)的服務(wù)器上托管了你的應(yīng)用程序?,F(xiàn)在,如果你有來(lái)自印度的請(qǐng)求,你需要很長(zhǎng)時(shí)間才能為該請(qǐng)求提供內(nèi)容。
為了解決這個(gè)問(wèn)題,CDN 應(yīng)運(yùn)而生。 CDN 可以幫你緩存多個(gè)靜態(tài)頁(yè)面?,F(xiàn)在你的請(qǐng)求將首先到達(dá) CDN,如果內(nèi)容存在于 CDN 中,則直接提供頁(yè)面。這極大地提高了你的內(nèi)容服務(wù)速度以及最終用戶(hù)體驗(yàn)。
15. 壓縮 CSS 和 JS
在生產(chǎn)環(huán)境中實(shí)際捆綁這些文件之前,你應(yīng)該始終壓縮 CSS 和 JavaScript 文件。 這將增強(qiáng)你的用戶(hù)體驗(yàn)并減少 HTTP 調(diào)用。 這是一個(gè)很棒的 Laravel 性能優(yōu)化技巧。
有多種工具可用于壓縮這些文件并將它們捆綁為單個(gè)文件。 你可以使用 Laravel-packer,它允許你打包和壓縮你的 CSS 和 JavaScript 代碼。 如果需要,你還可以調(diào)整圖像大小以生成縮略圖。
16. 移除開(kāi)發(fā)依賴(lài)
首次安裝 Laravel 或 composer 時(shí),通常會(huì)默認(rèn)將開(kāi)發(fā)依賴(lài)項(xiàng)注入到你的系統(tǒng)中。 雖然這些依賴(lài)項(xiàng)確實(shí)有助于構(gòu)建你的網(wǎng)站,但當(dāng)你的網(wǎng)站啟動(dòng)并運(yùn)行時(shí),你不需要這些依賴(lài)項(xiàng)。
你可以通過(guò) Artisan 輸入這個(gè)簡(jiǎn)單的命令來(lái)刪除這些依賴(lài)項(xiàng):
composer install --prefer-dist --no-dev -o
注意: 開(kāi)發(fā)依賴(lài)項(xiàng)不同于運(yùn)行時(shí)所需的依賴(lài)項(xiàng)。 不要?jiǎng)h除運(yùn)行時(shí)依賴(lài)項(xiàng),因?yàn)檫@可能會(huì)影響你網(wǎng)站的性能,甚至?xí)?dǎo)致你網(wǎng)站的某些部分崩潰。
17. 將Lumen用于小型項(xiàng)目
有時(shí)開(kāi)發(fā)小型應(yīng)用程序(例如移動(dòng)或 Angular 應(yīng)用程序)不需要使用像 Laravel 這樣的全??蚣堋?在這種情況下,請(qǐng)考慮改用 Lumen。
Lumen 是由 Laravel 的同一創(chuàng)建者開(kāi)發(fā)的微框架。 就像 Laravel 的輕量級(jí)版本一樣,Lumen 是關(guān)于微服務(wù)的速度和性能的。 在構(gòu)建 Web 應(yīng)用程序時(shí),它需要最少的設(shè)置和替代路由參數(shù),從而加快開(kāi)發(fā)過(guò)程。
例如,Lumen 每秒可以處理 100 個(gè)請(qǐng)求。 你還可以集成來(lái)自第三方的工具或軟件包以獲得新功能。 此外,Lumen 支持所有平臺(tái)并允許你升級(jí)到 Laravel。
18. 限制包含的庫(kù)
Laravel 讓你可以自由添加任意數(shù)量的庫(kù)。 雖然這是一個(gè)很棒的功能,但添加大量庫(kù)會(huì)給應(yīng)用程序的性能帶來(lái)很大壓力。 它還會(huì)影響整個(gè)用戶(hù)體驗(yàn)。
因此,掃描代碼中當(dāng)前使用的所有庫(kù)數(shù)據(jù)至關(guān)重要。 你可以在 config/app.php
文件中找到這些庫(kù)。 在檢查庫(kù)時(shí),刪除你知道對(duì)你不再有用的庫(kù)。
查看 composer.json
中不需要的依賴(lài)項(xiàng)也是一個(gè)好辦法。
感謝你們的閱讀!
原文地址:https://devdojo.com/techvblogs/how-to-op…
譯文地址:https://learnku.com/laravel/t/69775
【