使用laravel db,listen,出现的情况

evilk

1.环境情况

2.代码情况
controller:

中间件:

3.情况描述

  • 第一次请求

  • 第二次请求

  • 第三次请求

  • 第四次请求

问题:
感觉就是

\Illuminate\Database\Events\QueryExecuted $query

会记录当前连接的所有SQL,因为当前进程的MySQL链接不会断开,每次打印SQL,会把之前所有请求的SQL都打印出来
如果想只打印当前请求的SQL,应该如何处理?

文档中ARMS监控,也有这样的代码
不知道是否也会出现类似的问题

2140 1 0
1个回答

walkor

因为每次请求都执行中间件,都会加一个监听,所以就会有重复的监听,会重复打印。
这个监听不适合放在中间件,适合放在进程启动项。

新建 app/bootstrap/Report.php(目录不存在时自行创建)

<?php
namespace app\bootstrap;
use Webman\Bootstrap;
use support\Db;

class Report implements Bootstrap
{
    public static function start($worker)
    {
        Db::listen(function(\Illuminate\Database\Events\QueryExecuted $query) {
           echo $query->sql. "\n";
        });
    }
}

打开 config/bootstrap.php 添加如下配置
<?php

return [
    // ... 这里省略其它配置 ...
    app\bootstrap\Report::class,
];

以上两步就完成了进程启动时设置SQL监听。

  • evilk 2021-12-27

    非常感谢,那文档中ARMS部分中,在中间件添加的那段监听,是不是也需要放到进程启动时?

  • walkor 2021-12-27

    那个有做判断,只会初始化一次

  • badman 2022-01-14

    我按你的代码设置,在homestead环境php8.0下,监听不成功。

年代过于久远,无法发表回答
🔝