」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Laravel 中程式碼優化和效能改進的技巧

Laravel 中程式碼優化和效能改進的技巧

發佈於2024-11-02
瀏覽:950

Tips for Code Optimization and Performance Improvement in Laravel

Laravel 是一个强大而优雅的框架,但随着应用程序的增长,优化其性能变得至关重要。这是一份包含提示和示例的综合指南,可帮助您提高性能并优化 Laravel 应用程序。

1. 预加载与延迟加载

问题:默认情况下,Laravel 使用延迟加载,这可能会导致“N 1 查询问题”,即不必要地触发多个数据库查询。

优化:使用热切加载在一个查询中加载相关数据,显着提高处理关系时的性能。

之前(延迟加载):

// This runs multiple queries (N 1 Problem)
$users = User::all();

foreach ($users as $user) {
    $posts = $user->posts;
}

之后(预加载):

// This loads users and their posts in just two queries
$users = User::with('posts')->get();

关键要点:当您知道需要相关模型时,始终使用预先加载。


2. 对昂贵的查询使用缓存

问题:频繁获取相同的数据(如用户列表、设置或产品目录)可能会造成性能瓶颈。

优化:缓存昂贵的查询和计算的结果,以减少加载时间和数据库查询。

之前(无缓存):

// Querying the database every time
$users = User::all();

之后(使用缓存):

// Caching the user data for 60 minutes
$users = Cache::remember('users', 60, function () {
    return User::all();
});

关键要点:使用 Laravel 的缓存系统(Redis、Memcached)来减少不必要的数据库查询。


3.优化数据库查询

问题:低效的查询和缺乏适当的索引会大大降低性能。

优化:始终将索引添加到经常查询的列,并且仅使用所需的数据。

前:

// Fetching all columns (bad practice)
$orders = Order::all();

后:

// Only fetching necessary columns and applying conditions
$orders = Order::select('id', 'status', 'created_at')
    ->where('status', 'shipped')
    ->get();

关键要点:始终指定您需要的列,并确保您的数据库在经常查询的字段上有正确的索引。


4. 尽量减少中间件的使用

问题:将中间件全局应用到每个路由会增加不必要的开销。

优化:仅在需要的地方有选择地应用中间件。

之前(全局中间件使用):

// Applying middleware to all routes
Route::middleware('logRouteAccess')->group(function () {
    Route::get('/profile', 'UserProfileController@show');
    Route::get('/settings', 'UserSettingsController@index');
});

之后(选择性中间件使用):

// Apply middleware only to specific routes
Route::get('/profile', 'UserProfileController@show')->middleware('logRouteAccess');

关键要点:中间件应仅在必要时应用,以避免性能下降。


5. 优化大型数据集的分页

问题:一次获取和显示大型数据集可能会导致内存使用率高且响应速度慢。

优化:使用分页限制每个请求获取的记录数。

之前(获取所有记录):

// Fetching all users (potentially too much data)
$users = User::all();

之后(使用分页):

// Fetching users in chunks of 10 records per page
$users = User::paginate(10);

关键要点:对大型数据集进行分页以避免数据库不堪重负并减少内存使用。


6. 对长时间运行的任务进行排队

问题:发送电子邮件或生成报告等长时间运行的任务会减慢请求响应时间。

优化:使用队列卸载任务并在后台异步处理。

之前(同步任务):

// Sending email directly (slows down response)
Mail::to($user->email)->send(new OrderShipped($order));

之后(排队任务):

// Queuing the email for background processing
Mail::to($user->email)->queue(new OrderShipped($order));

要点:对时间不敏感的任务使用队列以缩短响应时间。


7. 使用路由、配置和视图缓存

问题:不缓存路由、配置或视图可能会导致性能下降,尤其是在生产环境中。

优化:缓存路由、配置文件和视图,以提高生产性能。

命令示例:

# Cache routes
php artisan route:cache

# Cache configuration files
php artisan config:cache

# Cache compiled views
php artisan view:cache

关键要点:始终在生产环境中缓存您的配置、路由和视图,以提高应用程序性能。


8. 使用compact()来清理代码

问题:手动将多个变量传递给视图可能会导致代码冗长且难以管理。

优化:使用compact()简化将多个变量传递到视图的过程。

前:

return view('profile', [
    'user' => $user,
    'posts' => $posts,
    'comments' => $comments,
]);

后:

return view('profile', compact('user', 'posts', 'comments'));

要点:使用compact()可以让你的代码更简洁,更容易维护。


9.使用Redis或Memcached进行会话和缓存存储

问题:在文件系统中存储会话和缓存数据会在高流量环境中降低应用程序的速度。

优化:使用快速内存​​存储解决方案,例如RedisMemcached以获得更好的性能。

Redis 的示例配置:

// In config/cache.php
'default' => env('CACHE_DRIVER', 'redis'),

// In config/session.php
'driver' => env('SESSION_DRIVER', 'redis'),

关键要点:避免在生产中使用文件驱动程序进行会话和缓存,尤其是在高流量应用程序中。


10.除非必要,否则避免使用原始查询

问题:使用原始 SQL 查询可能会降低代码的可读性和维护难度。

优化:尽可能使用 Laravel 的 Eloquent ORM 或查询生成器,但如果需要原始查询,请确保对其进行优化。

之前(原始查询):

// Using raw query directly
$users = DB::select('SELECT * FROM users WHERE status = ?', ['active']);

之后(使用 Eloquent 或查询生成器):

// Using Eloquent ORM for better readability and maintainability
$users = User::where('status', 'active')->get();

要点:除非绝对必要,否则优先使用 Eloquent ORM 而不是原始查询。


11.使用高效的日志记录级别

问题:始终记录所有内容可能会导致性能下降并填满存储空间。

优化:在生产中设置适当的日志级别以仅捕获必要的内容(例如错误和关键消息)。

例子:

// In .env file, set log level to 'error' in production
LOG_LEVEL=error

关键要点:仅记录生产中必要的内容,以避免不必要的存储使用和性能影响。


最后的想法

优化 Laravel 性能对于可扩展和高效的应用程序至关重要。通过实施这些最佳实践,您可以确保 Laravel 应用程序运行得更快、处理更多流量并提供更好的用户体验。

让我知道您的想法,或者随时分享您自己的优化 Laravel 应用程序的提示和技巧!

编码愉快! ?

版本聲明 本文轉載於:https://dev.to/harish_kumars_9c58df6fcc/10-tips-for-code-optimization-and-performance-improvement-in-laravel-1e99?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • IntTo Float64 JSON轉換之謎
    IntTo Float64 JSON轉換之謎
    使用 JSON 聽起來簡單明了,你有一些結構,你可以將其更改為 JSON - 一種通用的統一語言並返回到你的結構。簡單吧? ? 嗯,是的,但是直到您遇到 Marshal / Unmarshal 函數的一些奇怪行為。 問題 ? 這一切都是從我嘗試從 JWT 令牌讀取編碼的有效負載時...
    程式設計 發佈於2024-11-02
  • 如何從 Ubuntu 12.04 中徹底刪除 MySQL 5.7?
    如何從 Ubuntu 12.04 中徹底刪除 MySQL 5.7?
    刪除 MySQL 5.7:清除和卸載綜合指南要從 Ubuntu 12.04 系統中完全刪除 MySQL 5.7,請按照以下綜合步驟操作:備份資料庫在繼續卸載之前,請確保您已使用 mysqldump 公用程式備份了基本資料庫。僅備份所需的資料庫,因為完整資料庫備份可能是卸載問題的根本原因。 停止MyS...
    程式設計 發佈於2024-11-02
  • 如何在沒有 CLI 存取的情況下清除共享託管伺服器上的 Laravel 5 快取?
    如何在沒有 CLI 存取的情況下清除共享託管伺服器上的 Laravel 5 快取?
    在Laravel 5 中清除共享託管伺服器上的快取在Laravel 5 中,您可以使用cache:clear Artisan 命令有效地清除快取。但是,在共享託管伺服器上工作時,您可能無權存取 CLI。這就提出了一個問題:我可以在缺乏控制面板存取權限的共用主機伺服器上不使用 CLI 來清除快取嗎? ...
    程式設計 發佈於2024-11-02
  • Websocket 或 Socket io!讓我們來看看吧!
    Websocket 或 Socket io!讓我們來看看吧!
    WebSockets 与 Socket.IO:实时对决 当谈到网络上的实时通信时,开发人员经常发现自己陷入两个选择之间:WebSockets 和 Socket.IO。这两种工具都擅长它们的工作——提供了一种在客户端和服务器之间实现双向通信的方法——但每种工具都有自己独特的个性。这有...
    程式設計 發佈於2024-11-02
  • Deno 起飛
    Deno 起飛
    网络是人类最大的软件平台,拥有超过 50 亿用户,并且还在不断增长。然而,随着 Web 开发需求的飙升,其复杂性也随之增加。在无尽的配置文件、大量的样板文件和大量的依赖项之间,开发人员花费更多的时间来进行设置,而不是构建下一个大东西。? 进入 Deno,这是一种用于 JavaScript 和 Typ...
    程式設計 發佈於2024-11-02
  • 使用 Django Rest Framework 尋找海森堡
    使用 Django Rest Framework 尋找海森堡
    The idea The idea was to create a simple platform for DEA agents, to manage information about characters from the Breaking Bad/Better Call Sa...
    程式設計 發佈於2024-11-02
  • 湯姆和傑瑞燈代碼
    湯姆和傑瑞燈代碼
    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ...
    程式設計 發佈於2024-11-02
  • 透過實作學習 TDD:在 Umbraco 的富文本編輯器中標記成員
    透過實作學習 TDD:在 Umbraco 的富文本編輯器中標記成員
    在我正在建構的系統中,我需要能夠在網站的文字中提及 Umbraco 會員。為此,我需要建立 Umbraco 富文本編輯器的擴充:TinyMCE。 情境 作為內容編輯者,我想在訊息或文章中標記成員,以便他們收到有關其新內容的通知。 我研究了類似的實現,例如 Slack 或 X 上的...
    程式設計 發佈於2024-11-02
  • 如何在Python測試情境中模擬HTTP請求和回應?
    如何在Python測試情境中模擬HTTP請求和回應?
    Python 測試的模擬請求和回應在Python 測試中,有必要模擬模組及其功能來控制執行流程並驗證具體場景。其中,模擬 requests 模組通常用於測試依賴 HTTP 請求的函數或方法。 考慮一個包含以下程式碼的views.py 檔案:def myview(request): res1 ...
    程式設計 發佈於2024-11-02
  • 如何建立適用於 Windows、Linux 和 macOS 的 Python 條碼掃描器
    如何建立適用於 Windows、Linux 和 macOS 的 Python 條碼掃描器
    条形码扫描已成为从零售、物流到医疗保健等各个行业的重要工具。在桌面平台上,它可以快速捕获和处理信息,无需手动输入数据,从而节省时间并减少错误。在本教程中,我们将通过构建适用于 Windows、Linux 的 Python 条形码扫描仪 继续探索 Dynamsoft Capture Vision SD...
    程式設計 發佈於2024-11-02
  • ## 如何在 Python 中建立不可變物件以及為什麼 nametuple 是最好的方法?
    ## 如何在 Python 中建立不可變物件以及為什麼 nametuple 是最好的方法?
    Python 中的不可變物件在 Python 中,不變性為保護資料完整性提供了一種有價值的機制。然而,創建不可變物件會帶來一定的挑戰。 重寫 setattr常見的方法是重寫 setattr方法。然而,即使在 init 過程中也會呼叫此方法,因此它不適合建立不可變物件。 子類化 Tuple另一種策略涉...
    程式設計 發佈於2024-11-02
  • 最常被問到的 React 面試問題
    最常被問到的 React 面試問題
    如何優化 React 應用程式的效能? 1。組件應謹慎更新 實作 shouldComponentUpdate 或 React.memo 透過比較 props 或 states 來防止不必要的重新渲染。 2.使用功能組件和鉤子 帶鉤子的功能組件通常比類組件性能更高。 3.延遲載入...
    程式設計 發佈於2024-11-02
  • (Wordpress 初學者):僅將子網域從託管轉移(遷移)到另一個新託管。
    (Wordpress 初學者):僅將子網域從託管轉移(遷移)到另一個新託管。
    我只想從 Bluehost 託管轉移(遷移)一個新託管(例如 Fastcomet 或 Chemicloud)的子網域。 我想知道我遷移子網域的步驟是否正確以及我應該做什麼更改 DNS 內容...... ** 我的情況1:** – 主 Web 網域(例如:forcleanworld.com)保留在 ...
    程式設計 發佈於2024-11-02
  • 使用 Java 進行資料分析:資訊處理初學者指南
    使用 Java 進行資料分析:資訊處理初學者指南
    Java 是適用於資料分析的強大語言,它提供用於處理大型資料集和執行複雜分析的基礎結構,包括:資料結構:用於儲存和組織資料的集合,例如陣列和清單。 IO 流:用於讀取和寫入檔案的物件。 Java 集合框架:用於管理和操作資料結構的強大集合類別庫。使用 Java 進行資料分析的實際案例包括分析文字文件...
    程式設計 發佈於2024-11-02
  • 僱用自由 Python 開發人員時要避免的常見錯誤
    僱用自由 Python 開發人員時要避免的常見錯誤
    介紹 聘請合適的自由 Python 開發人員可以決定你的專案的成敗。然而,許多企業在招募過程中會犯一些常見的錯誤,這些錯誤可能會導致招募延遲、成本超支和結果不佳。以下是如何避免這些陷阱並確保專案成功的方法。 沒有明確定義專案要求 最常見的錯誤之一是在開始招募流程之...
    程式設計 發佈於2024-11-02

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3