TP下实现sql日志的功能

文章讲述了如何使用阿里云RDS的SQL洞察功能进行问题排查,但因其成本较高,作者选择自建SQL日志系统。在使用Swoole时遇到同一进程中SQL日志过多的问题,通过监听TP框架的SQL执行并记录到Redis,再同步到数据库。作者发现控制器和进程标识错误,原因是Swoole的进程驻留内存特性,解决方案是每次记录SQL时实例化请求对象,并自定义进程ID。
摘要由CSDN通过智能技术生成

一直都是用阿里云RDS的sql洞察,这东西说白了就是全量的sql日志,如果有bug,一时不知道从哪里查,去看下sql日志,能很快的定位到问题,比如订单状态有异常,那么就去找那句update的sql,根据进程号找到同一进程下的sql,就能快速定位到代码了,很方便。问题就是比较贵,不过自己搭建也是需要成本,所以就一直用了。

有个项目用了swoole,有次查问题,发现同一个进程下的sql有上万条,而且时间跨度很大。这样就没法排查问题了,所以就想要自己记录sql日志。

思路很简单,利用tp本来就有的sql监听函数Db::listen,监听到sql记录到redis队列里,然后再由另一个任务获取数据放到数据库中。

其中一些细节就按照自己的需求,比如我记录了sql的耗时,影响行数,进程id,当前控制器等。

然后我就发现,这个控制器有问题,某些sql明显是控制器A的,但是记录的却是控制器B,然后查看进程,也是和阿里云一样,一个进程几千上万sql。开始有点慌,静下心来想想,swoole下代码都进驻内存了,所以造成记录的控制器和进程都是一样的。传统的php开发,每次打开一个页面都是一个新的php进程,所以自然没有这个问题。

解决办法就是每次要记录sql时,都实例化一下$request=request();这样控制器的问题就解决了

进程号的话,就是自己定义一个,写在app\Request的初始化里,自己新增一个set_pid方法,pid就是当前毫秒+随机数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值