Laravel8的迁移压缩、任务批处理、速率限制优化 | 文末抽奖

爱被打了一巴掌 2024-03-26 18:47 22阅读 0赞

之前写了一篇Laravel提高DB查询效率的文章,转发到群里后竟然有人质疑我说“Laravel是他好几年前用的框架,没想到现在还有人在用。”

纳尼,什么意思嘛?别忘了PHP是最好的语言!

个人认为Laravel是非常优雅的开发框架:优雅的设计模式、强大的功能实现、各种方便的扩展、持续的版本更新,更主要的是迄今为止我认为最优秀的技术开发社区。

我必须为Laravel打Call。

2020年9月8号,Laravel发布了8.0版本。Laravel计划于2022年1月25日发布9.0版本。

下面我介绍一下目前Laravel最新版(8.0版本)的新特性:

Laravel 8 通过引入 Laravel Jetstream,模型工厂类,迁移压缩,队列批处理,改善速率限制,队列改进,动态 Blade 组件,Tailwind 分页视图, 时间测试助手,artisan serve 的改进,事件监听器的改进,以及各种其他错误修复和可用性改进,对 Laravel 7.x 继续进行了改善。

迁移压缩

在你开发应用的过程中,随着时间的推移,你的迁移文件可能会累积的越来越多,这可能导致你的迁移目录变得非常臃肿。现在你可以把你的迁移文件压缩成一个 SQL 文件。执行 schema:dump 即可:

  1. php artisan schema:dump
  2. // 转储当前数据库模式并删除所有现有的迁移…
  3. php artisan schema:dump --prune

执行完这条命令,Laravel 将会在 database/schema 目录写入一个「schema」文件。当在未执行任何其他迁移的情况下,你迁移数据库时,Laravel 将会先执行 schema 文件中的 SQL,再执行不包含在 schema 中的剩余迁移。

任务批处理

Laravel 的任务批处理特性让你可以简单地执行批量任务,然后在批量任务执行完成后再执行一些操作。Bus facade 中新增了一个 batch 方法可以用来执行批量任务。当然,批处理主要是和回调结合使用的。所以,你可能需要使用 then,catch,finally 方法来定义完整的回调。这三种回调任意一个被调用时都会接收到一个 Illuminate\Bus\Batch 实例:

  1. use App\Jobs\ProcessPodcast;
  2. use App\Podcast;
  3. use Illuminate\Bus\Batch;
  4. use Illuminate\Support\Facades\Batch;
  5. use Throwable;
  6. $batch = Bus::batch([
  7. new ProcessPodcast(Podcast::find(1)),
  8. new ProcessPodcast(Podcast::find(2)),
  9. new ProcessPodcast(Podcast::find(3)),
  10. new ProcessPodcast(Podcast::find(4)),
  11. new ProcessPodcast(Podcast::find(5)),
  12. ])->then(function (Batch $batch) {
  13. // All jobs completed successfully...
  14. })->catch(function (Batch $batch, Throwable $e) {
  15. // First batch job failure detected...
  16. })->finally(function (Batch $batch) {
  17. // The batch has finished executing...
  18. })->dispatch();
  19. return $batch->id;

速率限制优化

Laravel 的请求速率限制器得到了增强,具有更大的灵活性和功能,同时兼容上一个版本的 throttle 中间件。使用 RateLimiter facade 的 for 方法来定义一个速率限制器。for 方法第一个参数是速率限制器名称,第二个参数是一个闭包函数,该闭包函数返回速率限制器的配置。

  1. use Illuminate\Cache\RateLimiting\Limit;
  2. use Illuminate\Support\Facades\RateLimiter;
  3. RateLimiter::for('global', function (Request $request) {
  4. return Limit::perMinute(1000);
  5. });

因为速率限制器的回调函数传入的是一个 HTTP 请求实例,你可以基于请求或当前认证的用户来动态设置速率限制。

  1. RateLimiter::for('uploads', function (Request $request) {
  2. return $request->user()->vipCustomer()
  3. ? Limit::none()
  4. : Limit::perMinute(100);
  5. });

有时你可能希望根据一些特定的值来进行速率限制。比如你希望限制用户每分钟内每个 IP 地址最多发起 100 次请求,你可以使用 by 方法来实现这一功能:

  1. RateLimiter::for('uploads', function (Request $request) {
  2. return $request->user()->vipCustomer()
  3. ? Limit::none()
  4. : Limit::perMinute(100)->by($request->ip());
  5. });

使用 throttle 中间件 将刚刚创建的速率限制器绑定到路由或者路由组就可以了。将速率限制器的名称传入中间件来进行绑定:

  1. Route::middleware(['throttle:uploads'])->group(function () {
  2. Route::post('/audio', function () {
  3. //
  4. });
  5. Route::post('/video', function () {
  6. //
  7. });
  8. });

抽奖活动点击这里

发表评论

表情:
评论列表 (有 0 条评论,22人围观)

还没有评论,来说两句吧...

相关阅读