线上环境关于时间查询的一个坑
作者:James Zhu ([email protected])
创建日期:2018-07-05
引言
EPP有个自动补货脚本,脚本每12分钟运行一次。最近得到反馈,好几次设置的12点整,却没有完成补货。这是为什么呢?
问题排查
取活动设置的代码如下:
$nextRunTimeBefore = date('Y-m-d H:i:s');
$coinProductEventIds = $coinProductEventMgr->findCoinProductEvents(array('nextRunTimeBefore' => $nextRunTimeBefore));
isset($filter['nextRunTimeBefore']) && $qf->addCondition(new Condition('nextRunTime', Condition::$EQLT, $filter['nextRunTimeBefore']));
最终执行的SQL类似:
SELECT * FROM CoinProductEvent WHERE nextRunTime <= '2018-07-05 12:00:00'
那么问题在哪呢?
通过猜测并在线上记录日志,发现计划任务触发的时间略有波动,以下记录了一段时间内$nextRunTimeBefore
的值,结果如下:
2018-07-05 12:00:00
2018-07-05 12:11:59
2018-07-05 12:23:59
2018-07-05 12:36:00
2018-07-05 12:48:00
那么问题就比较清楚了,因为PHP服务器的时间与期望的时间略有差异,因此对于这种时间精度要求比较高的查询语句,就会造成没有查询结果。因此,我对代码稍作修改,解决了这个问题。
$nextRunTimeBefore = date('Y-m-d H:i:s' + 60);
$coinProductEventIds = $coinProductEventMgr->findCoinProductEvents(array('nextRunTimeBefore' => $nextRunTimeBefore));