线上环境关于时间查询的一个坑

作者: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));

results matching ""

    No results matching ""