一直都是用阿里云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就是当前毫秒+随机数