最近在做计划任务处理的时候发现一个小BUG,执行计划任务的时候因为没有初始化时区,而导致我用mktime获取时间错误。我的计划任务每个小时需要统计一次今天某个数据的总量,用mktime获取了时间戳。因为在执行计划任务的时候默认设置时区为0,导致我mktime获得的时间戳不正确,从而导致了数据查询的失败。
看源代码:
class_core.php
构造函数初始化系统
复制代码
function _init_env()函数会将时区设置为0.
- define('TIMESTAMP', time()); $this->timezone_set();
复制代码
初始化函数
- function init() {
- if(!$this->initated) {
- $this->_init_db();
- $this->_init_memory();
- $this->_init_user();
- $this->_init_session();
- $this->_init_setting();
- $this->_init_mobile();
- $this->_init_cron();
- $this->_init_misc();
- }
- $this->initated = true;
- }
复制代码
调用初始化函数init的时候,会先执行计划任务函数_init_cron,再执行_init_misc函数。而恰恰只有在执行_init_misc函数的时候,discuz才会设置正确的时区。
_init_misc()
- $timeoffset = $this->init_setting ? $this->var['member']['timeoffset'] : $this->var['setting']['timeoffset'];
- $this->var['timenow'] = array(
- 'time' => dgmdate(TIMESTAMP),
- 'offset' => $timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset
- ); $this->timezone_set($timeoffset);
复制代码
所有导致计划任务mktime获取时间失败的原因就在于会先执行计划任务再初始化时区。
解决方案:
1、将_init_cron 函数和_init_misc 函数执行顺序对调。先设置时区再执行计划任务,不知道还有后果没有,没有测试。
2、在计划任务脚本中加入时区设置函数。比如:date_default_timezone_set($_G['setting']['timeoffset']);
复制代码
我火星了吗? |