之前自己开发的一个项目,在线上运行一个多月之后,有些页面异常的慢,讲道理十几万的数据根本不会超过0.5秒的打开时间的,然后我就排查,数据库做了慢查询日志,超过一秒的都会记录,但是记录一条都没有(事实上应该是没记到,不知道运维是不是配置错了),最后还逼我自己记录实时的sql语句才发现问题,搞得我框架的一些什么配置缓存、类映射都白做了,根本不是框架运行的锅。最后原因是有一张表我当时先设置了一个主键,后来因为需求加了一个自增长id,没有把老的主键换成唯一索引,就直接把id设置成主键了,结果形成一个组合主键,导致查询异常慢,因为我查询的时候都是单独用,并没有用到组合主键查询。

不过知道怎么使用laravel监听器来记录实时SQL了,开心。

一、首先创建监听器文件,进入laravel根目录

php artisan make:listener QueryListener --event=Illuminate\Database\Events\QueryExecuted
--event后面表示创建什么类型的监听器。当然你不用artisan自己创建也是可以的。

二、修改生成在app/Listeners/ QueryListener.php文件

namespace App\Listeners;

use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Event;

class QueryListener
{
/** * Create the event listener.
* * @return void
*/
public function __construct()
{
//
}

/**
 * Handle the event.
 *
 * @param  QueryExecuted  $event
 * @return void
 */
public function handle($event)
{
    $sql = str_replace("?", "'%s'", $event->sql);
    $log = vsprintf($sql, $event->bindings);
    Log::info($log);
}

}


三、 在app/Providers/ EventServiceProvider.php文件里添加修改

protected $listen = [
    'App\Events\Event' => [
        'App\Listeners\EventListener',
    ],
    'Illuminate\Database\Events\QueryExecuted' => [
        'App\Listeners\QueryListener',
    ],
];

大功告成咯,下面是我记录的结果