大数跨境

增强 Laravel 应用优化所需的一切

增强 Laravel 应用优化所需的一切 索引目录
2025-05-28
1
导读:关注【索引目录】服务号,更多精彩内容等你来探索!介绍:当应用程序规模扩大或需要处理大量数据时,优化技术就变得至关重要,这不仅可以防止错误,还可以提升整体用户体验。

关注【索引目录】服务号,更多精彩内容等你来探索!

介绍:

当应用程序规模扩大或需要处理大量数据时,优化技术就变得至关重要,这不仅可以防止错误,还可以提升整体用户体验。Laravel
是一个功能强大且成熟的框架,结合专业的优化策略,可以交付高性能的应用程序。
在本文中,我们将探讨一些实用的技巧和方法,帮助您优化 Laravel 应用程序,使其更高效、更具可扩展性。

1.数据库查询优化:

- 1.1. 预先加载:

预先加载解决了 N+1 查询问题,那么这个问题是什么呢?
下面的代码展示了我们如何迭代每本书来获取作者。

// app/Models/Book.php:
class Book extends Model
{
    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

// Then, in some Controller:
$books = Book::all();

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

因此我们对书籍有一个查询,对每个作者有 N 个查询


现在我们使用::with

// Instead of:
$books = Book::all();

// You should do:
$books = Book::with('author')->get();

差异显而易见



- 1.2. 仅选择需要的列select()

这一切都是为了避免传输不必要的数据,下面是一个select()结合使用的很好的例子Eager Loading

<?php
use App\Models\Post;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    $posts = Post::with('user:id,name')
              ->select('id','user_id','title')
              ->get();
    return view('posts', ['posts' => $posts]);
});

- 1.3. 安全且高效地处理大型数据集chunkById()

它专为大型数据集和生产规模应用程序而设计,chunkById()可防止 Laravel 一次将所有内容加载到内存中。

$posts = Post::all(); //too slow in large data sets

而是使用这个

$posts = collect();
Post::chunkById(1000, function ($collection) use (&$posts) { 
    $posts->push(...$collection);
}, 'id');

- 1.4. 使用查询生成器来处理原始数据,而不是 Eloquent 模型toBase()

当您获取大量行时,您可以通过跳过模型水化来减少内存使用量,或者以防您的 API 返回普通对象或数组。

$users = User::where('active', 1)->get();
// Each $user is a full Eloquent model
$users = User::where('active', 1)->toBase()->get();
// Each $user is a stdClass with only selected fields

⚠️不要在以下情况下使用它:
你需要 Eloquent 关系,
你正在使用访问器/修改器,
你依赖于模型事件或强制类型转换

2. Laravel 缓存:

优化不仅仅在于高效的查询和数据库结构,让我们来探索 Laravel 缓存。
缓存是一个强大的性能提升器,可以避免重复的数据库访问或昂贵的逻辑。

-昂贵的查询:查询缓存
在这个例子中,帖子将在缓存中保存 60 秒,不需要频繁查询

Cache::remember('posts', 60, fn() => Post::all());

-响应缓存:

用于静态或缓慢变化的页面,spatie/laravel-responsecache例如

-Config/view 缓存:
用于部署以加快启动速度,您可以使用php artisan config:cacheview:cache

3. 速率限制:

对于 API 保护和稳定性很重要 - 避免滥用和负载峰值,尤其是在公共 API 或高流量应用程序中
*Laravel 使用 RateLimiter 中间件
*可以为每个用户、IP、角色定义自定义规则:

RateLimiter::for('api', fn (Request $request) =>
  Limit::perMinute(60)->by($request->ip())
);

4.数据库索引:

除了 Laravel 本身之外——索引是一项核心 SQL 优化。

Laravel 迁移支持索引:

$table->index('user_id');
$table->unique(['email']);
$table->fullText('title');

5.Eloquent 性能技巧:

-避免加载未使用的关系,即withOnly()在 Laravel 11 中使用。-当只需要值时
使用pluck()而不是对于 Eloquent 开销太大的重逻辑, 更喜欢使用原始查询。get()
DB::select

6. 作业队列和后台处理:

将繁重工作(电子邮件、导出、第三方 API 等)移至后台队列。
使用 Laravel 队列:dispatch(new ExportJob());使用
工作线程的流程:Redis + Supervisor(或用于高并发的 Laravel Octane)。

结论:

Laravel 的优化不仅取决于高效的查询和数据库结构,还取决于缓存、索引、速率限制以及代码级最佳实践,例如分块和预加载。巧妙地使用 Laravel 的内置工具以及 SQL 调优和缓存层,可以显著提高性能和可扩展性。


关注【索引目录】服务号,更多精彩内容等你来探索!

【声明】内容源于网络
0
0
索引目录
索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
内容 444
粉丝 0
索引目录 索引目录是一家专注于医疗、技术开发、物联网应用等领域的创新型公司。我们致力于为客户提供高质量的服务和解决方案,推动技术与行业发展。
总阅读12
粉丝0
内容444