Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

[复制链接]
leeldy 发表于 2013-1-16 17:41:27 | 显示全部楼层 |阅读模式
    最近在做计划任务处理的时候发现一个小BUG,执行计划任务的时候因为没有初始化时区,而导致我用mktime获取时间错误。我的计划任务每个小时需要统计一次今天某个数据的总量,用mktime获取了时间戳。因为在执行计划任务的时候默认设置时区为0,导致我mktime获得的时间戳不正确,从而导致了数据查询的失败。
    看源代码:
class_core.php
构造函数初始化系统
  1. function discuz_core() {
复制代码
function _init_env()函数会将时区设置为0.
  1.   define('TIMESTAMP', time());
  2.                 $this->timezone_set();
复制代码
初始化函数
  1. function init() {
  2.                 if(!$this->initated) {
  3.                         $this->_init_db();
  4.                         $this->_init_memory();
  5.                         $this->_init_user();
  6.                         $this->_init_session();
  7.                         $this->_init_setting();
  8.                         $this->_init_mobile();

  9. $this->_init_cron();
  10.                         $this->_init_misc();
  11.                 }
  12.                 $this->initated = true;

  13.         }
复制代码
调用初始化函数init的时候,会先执行计划任务函数_init_cron,再执行_init_misc函数。而恰恰只有在执行_init_misc函数的时候,discuz才会设置正确的时区。
_init_misc()
  1.   $timeoffset = $this->init_setting ? $this->var['member']['timeoffset'] : $this->var['setting']['timeoffset'];
  2.                 $this->var['timenow'] = array(
  3.                         'time' => dgmdate(TIMESTAMP),
  4.                         'offset' => $timeoffset >= 0 ? ($timeoffset == 0 ? '' : '+'.$timeoffset) : $timeoffset
  5.                 );
  6.                 $this->timezone_set($timeoffset);
复制代码
所有导致计划任务mktime获取时间失败的原因就在于会先执行计划任务再初始化时区。

解决方案:
    1、将_init_cron 函数和_init_misc 函数执行顺序对调。先设置时区再执行计划任务,不知道还有后果没有,没有测试。
    2、在计划任务脚本中加入时区设置函数。比如:
  1. date_default_timezone_set($_G['setting']['timeoffset']);
复制代码
我火星了吗?


 楼主| leeldy 发表于 2013-1-17 08:46:48 | 显示全部楼层
解决方案2写错了,代码应该是:
  1. $discuz = & discuz_core::instance();
  2.     $discuz->timezone_set($_G['setting']['timeoffset']);
复制代码
回复

使用道具 举报

下砂 发表于 2013-1-17 10:56:04 | 显示全部楼层
已反馈~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-3-3 17:21 , Processed in 0.025366 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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