关于php:Laravel 5.3 – 如何记录页面上的所有查询?

Laravel 5.3 - How to log all queries on a page?

我和我的团队正在进行一个相当大的项目。到处都有查询——在控制器中,在视图中的视图组合器中(延迟加载),以及可能在其他一些服务中。现在很难跟踪所有这些内容,页面加载速度也相当慢。

我将把db::EnableQueryLog()和db::GetQueryLog()放在哪里记录并转储所有查询?基本上,我在代码中寻找在任何查询发生之前发生的位置(放置enableQueryLog()),我在寻找在视图呈现之后发生的位置(转储getQueryLog())。

解决这个问题的好方法是什么?

事先谢谢。


下面是一个完美的例子:

https://laravel.com/docs/5.3/database监听查询事件

打开appprovidersappserviceprovider.php,将以下内容添加到Boot()函数中:

1
2
3
4
5
6
7
DB::listen(function ($query) {
    var_dump([
        $query->sql,
        $query->bindings,
        $query->time
    ]);
});


您可以将其添加到providers/appserviceprovider.php文件中,并在laravel日志文件中用tail检查它们:

1
tail -f storage/logs/laravel.log

甚至可以使用要记录的查询进行筛选。例如,这里我使用的是LaravelPassport,不想记录所有OAuth查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Log;

public function register() {
    if (App::environment('local') && env('APP_URL') == 'http://localhost') {
        Event::listen('Illuminate\Database\Events\QueryExecuted', function ($query) {
            // filter oauth ones
            if (!str_contains($query->sql, 'oauth')) {
                Log::debug($query->sql . ' - ' . serialize($query->bindings));
            }
        });
    }
}


将此代码放在执行查询的代码的正上方

1
2
3
\DB::listen(function($sql) {
  die(\Illuminate\Support\Str::replaceArray('?', $sql->bindings, $sql->sql));
});

如果要打印在应用程序上执行的查询,请执行以下步骤。

步骤1:转到AppServiceProvider.php文件。//文件路径appprovidersappserviceprovider.php

步骤2:生成boot()方法并粘贴到下面的代码。

1
2
3
4
5
6
7
8
9
10
public function boot() {
        // Log queries
        if (true) {
            \DB::listen(function ($query) {
                \Log::info(
                    $query->sql, $query->bindings, $query->time
                );
            });
        }
    }

步骤3:现在您可以在lumen.log或laravel.log文件中看到查询。文件路径为laravel_appstoragelogslaravel.log或lumen.log。

享受……


此外,还提供套餐:

记录我的查询

https://packagist.org/packages/technoknol/log-my-queries

只需安装并将其条目添加到中间件。它将把所有查询记录在laravel.log默认日志文件中。


你在使用MySQL吗?你只需跟踪日志。

如何显示MySQL上最后执行的查询?

或者使用Laravel调试栏?


添加在请求完成后执行的中间件并记录查询…参见可终止的Middlware