美文网首页
Laravel 页面调优

Laravel 页面调优

作者: __o__o | 来源:发表于2018-07-03 15:24 被阅读0次

页面调优

安装 Laravel 开发者工具类 -laravel-debugbar[https://github.com/barryvdh/laravel-debugbar]。

1. 安装 Debugbar

使用 Composer 安装:

composer require "barryvdh/laravel-debugbar:~3.1" --dev

生成配置文件,存放位置 config/debugbar.php

php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

打开 config/debugbar.php ,将 enabled 的值设置为:

'enabled' => env('APP_DEBUG', false),

修改完以后, Debugbar 分析器的启动状态将由 .env 文件中 APP_DEBUG 值决定。

刷新列表页面即可看到我们的开发者工具栏:

2、N +1 问题

如图点击以下按钮,可看到整个页面执行了 33 条查询语句,往下滚动可以看到很多请求都是重复的:

Laravel 的默认分页是 15 条信息,如果我们在控制器中修改 paginate(30) 显示条目为 30 的话:

app/Http/Controllers/TopicsController.php

...

class TopicsController extends Controller

{

    ...

    public function index()

    {

        $topics = Topic::paginate(30);

        return view('topics.index', compact('topics'));

    }

...

}

可以看到现在的 SQL 查询数量为 63,是之前的两倍:

以上的问题就是 N+1 问题,不仅是 Laravel 中,所有的 ORM 关联数据读取中都存在此问题,新手很容易踩到坑。进而导致系统变慢,然后拖垮整个系统。

N+1 一般发生在关联数据的遍历时。在 resources/views/topics/_topic_list.blade.php 模板中,我们对 $topics 进行遍历,为了方便解说,我们将此文件里的代码精简为如下:

@if (count($topics))

    @foreach ($topics as $topic)
    . . . {{ $topic->user->name }}
    . . . {{ $topic->category->name }} . . .
    @endforeach
@else 暂无数据 ~_~ @endif

为了读取 user 和 category,每次的循环都要查一下 users 和 categories 表,在本例子中我们查询了 30 条话题数据,那么最终我需要执行的查询语句就是 30 * 2 + 1 = 61 条语句。如果我第一次查询出来的是 N 条记录,那么最终需要执行的 SQL 语句就是 N+1 次:

如何解决 N + 1 问题?

我们可以通过 Eloquent 提供的 预加载功能 来解决此问题:

app/Http/Controllers/TopicsController.php

...

class TopicsController extends Controller

{

...

    public function index()

    {

        $topics = Topic::with('user', 'category')->paginate(30);

        return view('topics.index', compact('topics'));

    }

    ...

}

方法 with() 提前加载了我们后面需要用到的关联属性 user 和 category,并做了缓存。后面即使是在遍历数据时使用到这两个关联属性,数据已经被预加载并缓存,因此不会再产生多余的 SQL 查询:

上图可以看到优化完成后,我们的 SQL 查询数量减少到只有 4 条,相应的,应用的响应时间也减少到 1.12 秒。

相关文章

  • Laravel 页面调优

    页面调优 安装 Laravel 开发者工具类 -laravel-debugbar[https://github.c...

  • SpringBoot配合Tomcat8相关方法

    配置管理页面权限 Tomcat8 调优 调优 Servlet配置 tomcat中server.xml配置详解 Sp...

  • Laravel的优化技巧

    性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能。 接下来分享一...

  • 10个技巧优化PHP程序Laravel 5框架

    性能一直是 Laravel 框架为人诟病的一个点,所以调优 Laravel 程序算是一个必学的技能。 接下来分享一...

  • JVM调优

    1 调优层次 性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代...

  • Twitter 工程师谈 JVM 调优

    一. 调优需要关注的几个方面 内存调优 CPU 使用调优 锁竞争调优 I/O 调优 二. Twitter 最大的敌...

  • Spark性能优化-开发调优

    Spark性能优化分为四个方面: 1、开发调优2、资源调优3、数据倾斜调优4、shuffle调优 1. 开发调优 ...

  • Spark性能优化-资源调优

    Spark性能优化分为四个方面: 1、开发调优2、资源调优3、数据倾斜调优4、shuffle调优 资源调优 num...

  • Laravel 5.6 中文文档翻译完成,译者 60 人,耗时

    图片来自 laravel-news.com Laravel 5.6 的文档地址: Laravel 5.6 文档页面...

  • 多页面应用-性能调优

    多页面应用由多个完整页面构成,资源文件(js, css)不公用,每个页面都需要加载,页面编写过多时,页面加载会贼慢...

网友评论

      本文标题:Laravel 页面调优

      本文链接:https://www.haomeiwen.com/subject/ovxjuftx.html