圣詹姆斯公园
  • Introduction
  • 算法
    • RSA算法原理
    • 小议分解质因数函数的实现
  • 开发
    • OTP简介
    • PHP命令行下的信号处理
    • 将普通字符转换为HTML转义字符
    • 如何在微信或给到APP中打开点评APP
    • 开源许可证教程
    • 线上环境关于时间查询的一个坑
    • Git
      • Git的4个阶段的撤销更改
      • Git实用配置笔记
      • Git忽略提交.gitignore
    • SugarCRM
      • SugarCRM6.5中字段定制显示方法研究
      • SugarCRM6.5支持使用Elasticsearch记录日志
      • SugarCRM6.5数据查询方法研究
  • 运维
    • shell终端输出内容美化
    • tcpdump使用简介
    • Wikitten的Nginx配置拾遗
    • 在Docker Terminal中运行容器中的PHPUnit
Powered by GitBook
On this page
  • 引言
  • 问题排查
  1. 开发

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

作者:James Zhu (fatindeed@hotmail.com)

创建日期: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));
Previous开源许可证教程NextGit

Last updated 6 years ago