关注【索引目录】服务号,更多精彩内容等你来探索!
介绍:
当应用程序规模扩大或需要处理大量数据时,优化技术就变得至关重要,这不仅可以防止错误,还可以提升整体用户体验。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:cache,view: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 调优和缓存层,可以显著提高性能和可扩展性。
关注【索引目录】服务号,更多精彩内容等你来探索!

