Laravel 5.3 - 如何记录页面上的所有查询?

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

我和我的团队正在进行一个相当大的项目。查询无处不在 - 在控制器中,在视图中的视图作曲家(延迟加载)以及可能在其他一些服务中。跟踪这一切变得越来越困难,目前页面加载速度相当慢。

我应该在哪里放置 \DB::enableQueryLog() 和 \DB::getQueryLog() 来记录所有查询并转储它们?基本上我正在寻找代码中发生在任何查询发生之前的某个地方(放置 enableQueryLog()),我正在寻找一个发生在视图呈现之后的地方(转储 getQueryLog())。

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

提前致谢。

添加一个在请求完成后执行并记录您的查询的中间件...请参阅Terminable Middlwares

完美的例子来了:

https://laravel.com/docs/5.3/database#listening-for-query-events

打开 app\Providers\AppServiceProvider.php 并将以下内容添加到 Boot() 函数:

DB::listen(function ($query) {
    var_dump([
        $query->sql,
        $query->bindings,
        $query->time
    ]);
});

您在使用 MySQL 吗?你可以只跟踪日志。

How to show the last queries executed on MySQL?

或者使用 Laravel 调试栏?

您可以将其添加到 Providers/AppServiceProvider.php 文件并在 laravel 日志文件中使用尾部检查它们:

tail -f storage/logs/laravel.log

您甚至可以使用要记录的查询进行过滤。例如,我在这里使用 Laravel Passport,不想记录所有 oauth 查询。

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:转到您的 AppServiceProvider.php 文件。 // 文件路径 App\Providers\AppServiceProvider.php

步骤 2:创建 boot() 方法并粘贴下面的代码。

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_app\storage\logs\laravel.log 或 lumen.log.

尽情享受....

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

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

刚刚为可执行查询修改:

\DB::listen(function ($query) {
   // Enclose in single quotes for string params.
   $bindings = collect($query->bindings)->map(function ($param) {
      if(is_numeric($param)) {
        return $param;
      } else {
        return "'$param'";
      }
   });

   \Log::info(\Illuminate\Support\Str::replaceArray('?', $bindings->toArray(), $query->sql));
});

此外还有可用的软件包:

记录我的查询

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

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