Discuz教程网

计划任务处理bug——时区设置

[复制链接]
authicon pftlwcbf 发表于 2013-2-3 08:45:38 | 显示全部楼层 |阅读模式
最近在做计划任务处理的时候发现一个小BUG,执行计划任务的时候因为没有初始化时区,而导致我用mktime获取时间错误。我的计划任务每个小时需要统计一次今天某个数据的总量,用mktime获取了时间戳。因为在执行计划任务的时候默认设置时区为0,导致我mktime获得的时间戳不正确,从而导致了数据查询的失败。
      看源代码:
  class_core.php
  构造函数初始化系统
    function discuz_core() {

复制代码
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']);

复制代码
我火星了吗?



上一篇:不知道怎么回事论坛附件下载提示出错
下一篇:QQ登陆报错
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2025-5-2 20:42

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表