分享

php – 如何获取Laravel 5中执行的查询? DB :: getQueryLog()返回空数组

 印度阿三17 2019-09-16

我正在尝试查看查询的日志,但DB :: getQueryLog()只是返回一个空数组:

$user = User::find(5);
print_r(DB::getQueryLog());

结果

Array
(
)

如何查看此查询的日志?

解决方法:

默认情况下,Laravel 5中禁用查询日志:
https://github.com/laravel/framework/commit/e0abfe5c49d225567cb4dfd56df9ef05cc297448

您需要通过调用以下命令启用查询日志:

DB::enableQueryLog();

或注册事件监听器:

DB::listen(
    function ($sql, $bindings, $time) {
        //  $sql - select * from `ncv_users` where `ncv_users`.`id` = ? limit 1
        //  $bindings - [5]
        //  $time(in milliseconds) - 0.38 
    }
);  

一些技巧

1.多个DB连接

如果您有多个数据库连接,则必须指定要记录的连接

要为my_connection启用查询日志:

DB::connection('my_connection')->enableQueryLog();

要获取my_connection的查询日志:

print_r(
   DB::connection('my_connection')->getQueryLog()
);

2.在哪里启用查询日志?

对于HTTP请求生命周期,您可以在某些BeforeAnyDbQueryMiddleware middleware的handle方法中启用查询日志,然后在同一中间件的terminate方法中检索已执行的查询.

class BeforeAnyDbQueryMiddleware
{
    public function handle($request, Closure $next)
    {
        DB::enableQueryLog();
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Store or dump the log data...
        dd(
            DB::getQueryLog()
        );
    }
}

中间件的链不会针对工匠命令运行,因此对于CLI执行,您可以在artisan.start事件侦听器中启用查询日志.

例如,您可以将它放在bootstrap / app.php文件中

$app['events']->listen('artisan.start', function(){
    \DB::enableQueryLog();
});

记忆

Laravel将所有查询保存在内存中.因此,在某些情况下,例如插入大量行或具有大量查询的长时间运行作业时,这可能会导致应用程序使用过多的内存.

在大多数情况下,您只需要查询日志以进行调试,如果是这种情况,我建议您仅为开发启用它.

if (App::environment('local')) {
    // The environment is local
    DB::enableQueryLog();
}

参考

> https:///docs/5.0/database#query-logging

来源:https://www./content-1-453751.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多