自己写了一个网站程序,开始还好好的,用了几天有个接口开始偶尔的报500错误,debug开了也没有任何提示.

起因

前几天写了一个简单的端口转发流量的控制面板,用了几天后,渲染流量使用情况的统计接口偶尔开始报500错误,也没有任何提示,而且随着时间推移,500错误越来越频繁.

排查原因

后来经过仔细排查,才发现,是流量统计问题,我这个是服务器每隔5分钟就向数据库push一次数据,多个服务器经过几天之后,数据多达十几万,查询汇总数据的时候,一次性全查出来,就会出错了,但是奇怪的是TP也不给报错信息,直接就500了,没有任何反应.

优化

我这原本是从数据库读出来,然后php再组装拼接数据,最后返回来用echarts渲染数据.
现在改为直接通过Mysql语句,mysql自己算一下,然后php再简单填充拼接一下就可以了.

通过格式化时间戳之后group by 一下即可解决.

# 格式化显示一年内每个月的流量使用
SELECT SUM(`bandwidth`) as `bandwidth`,FROM_UNIXTIME(`create_time`,'%Y-%m') AS `time` FROM `bandwidth_log` WHERE `create_time` >= 1609430400 AND `create_time` < 1640966400 GROUP BY `time` ORDER BY `time` 
# 格式化显示一月内每天的流量使用
SELECT SUM(`bandwidth`) as `bandwidth`,FROM_UNIXTIME(`create_time`,'%Y-%m-%d') AS `time` FROM `bandwidth_log` WHERE `create_time` >= 1619798400 AND `create_time` < 1622476800 GROUP BY `time` ORDER BY `time`
# 格式化显示一天内每小时的流量使用
SELECT SUM(`bandwidth`) as `bandwidth`,FROM_UNIXTIME(`create_time`,'%Y-%m-%d %H:00') AS `time` FROM `bandwidth_log` WHERE `create_time` >= 1621699200 AND `create_time` < 1621785600 GROUP BY `time` ORDER BY `time`

标签: thinkphp, MySql

添加新评论

Loading...
Fullscreen Image