保存到桌面加入收藏设为首页
问题哥
当前位置:首页 > Discuz

discuz的后台计划任务不运行,有什么好招?看下几个例子吧

2020-11-02 19:29:50         467   0

 

问题是 Discuz 论坛里的计划任务不执行了,没次都需要手动执行。一般问题表现在论坛首页今日昨日帖子不刷新。

这种情况一般是 有些插件的计划任务不执行导致的。

解决办法1
到后台-工具-计划任务查看一下,一般插件的计划任务都是在第一个,官方内置的计划任务都是cron_开头的。如图:discuz的后台计划任务不运行,有什么好招?看下几个例子吧

找到这个计划任务。如果可以删除的话,直接删除即可。

如果删除不了的话。查看该插件是否未开启或者已删除,直接到数据库找到pre_common_cron这个表删除这个计划任务。如图:
discuz的后台计划任务不运行,有什么好招?看下几个例子吧

或者将后台计划任务中的可用性取消勾选。

[title]解决办法2:[/title]

以上办法都无法解决可以考虑重置这个表pre_common_cron,到数据库执行如下字段即可。

DROP TABLE IF EXISTS pre_common_cron;
CREATE TABLE `pre_common_cron` (
`cronid` smallint(6) unsigned NOT NULL auto_increment,
`available` tinyint(1) NOT NULL default '0',
`type` enum('user','system','plugin') NOT NULL default 'user',
`name` char(50) NOT NULL default '',
`filename` char(50) NOT NULL default '',
`lastrun` int(10) unsigned NOT NULL default '0',
`nextrun` int(10) unsigned NOT NULL default '0',
`weekday` tinyint(1) NOT NULL default '0',
`day` tinyint(2) NOT NULL default '0',
`hour` tinyint(2) NOT NULL default '0',
`minute` char(36) NOT NULL default '',
PRIMARY KEY (`cronid`),
KEY `nextrun` (`available`,`nextrun`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk AUTO_INCREMENT=22 ;



INSERT INTO `pre_common_cron` (`cronid`, `available`, `type`, `name`, `filename`, `lastrun`, `nextrun`, `weekday`, `day`, `hour`, `minute`) VALUES?
(1, 1, 'system', '清空今日发帖数', 'cron_todaypost_daily.php', 1416342963, 1416412800, -1, -1, 0, '0'),
(2, 1, 'system', '清空本月在线时间', 'cron_onlinetime_monthly.php', 1414791807, 1417363200, -1, 1, 0, '0'),
(3, 1, 'system', '每日数据清理', 'cron_cleanup_daily.php', 1416357390, 1416432600, -1, -1, 5, '30'),
(5, 1, 'system', '每日公告清理', 'cron_announcement_daily.php', 1416346616, 1416412800, -1, -1, 0, '0'),
(6, 1, 'system', '限时操作清理', 'cron_threadexpiry_hourly.php', 1416357391, 1416358800, -1, -1, -1, '0'),
(7, 1, 'system', '论坛推广清理', 'cron_promotion_hourly.php', 1416347376, 1416412800, -1, -1, 0, '00'),
(8, 1, 'system', '每月主题清理', 'cron_cleanup_monthly.php', 1414860761, 1417384800, -1, 1, 6, '00'),
(9, 1, 'system', '道具自动补货', 'cron_magic_daily.php', 1416347946, 1416412800, -1, -1, 0, '0'),
(10, 1, 'system', '每日验证问答更新', 'cron_secqaa_daily.php', 1416357391, 1416434400, -1, -1, 6, '0'),
(11, 1, 'system', '每日标签更新', 'cron_tag_daily.php', 1416347946, 1416412800, -1, -1, 0, '0'),
(12, 1, 'system', '每日勋章更新', 'cron_medal_daily.php', 1416347947, 1416412800, -1, -1, 0, '0'),
(13, 1, 'system', '清理过期动态', 'cron_cleanfeed.php', 1416347948, 1416412800, -1, -1, 0, '0'),
(14, 1, 'system', '每日获取安全补丁', 'cron_checkpatch_daily.php', 1416353617, 1416421320, -1, -1, 2, '22'),
(15, 1, 'system', '定时发布主题', 'cron_publish_halfhourly.php', 1416357391, 1416358800, -1, -1, -1, '0 30'),
(16, 1, 'system', '每周广播归档', 'cron_follow_daily.php', 1416350694, 1416420000, -1, -1, 2, '0'),
(17, 1, 'system', '更新每日查看数', 'cron_todayviews_daily.php', 1416357389, 1416423600, -1, -1, 3, '0 5 10 15 20 25 30 35 40 45 50 55'),
(18, 0, 'system', '每日用户表优化', 'cron_member_optimize_daily.php', 1377225651, 0, -1, -1, 2, '0 5 10 15 20 25 30 35 40 45 50 55'),
(19, 0, 'user', '防水墙每日优化', 'cron_security_daily.php', 1416351485, 1416420000, -1, -1, 2, '0'),
(20, 1, 'system', '统计今日热帖', 'cron_todayheats_daily.php', 1416348808, 1416412800, -1, -1, 0, '0'),
(21, 0, 'user', '更新版块最后发表(防水墙相关)', 'cron_security_cleanup_lastpost.php', 0, 0, -1, -1, -1, '0');

到此问题即可解决。

 

X2版本的方法:

 

最近发现论坛内有些用户当月在线时间被清空,究其原因发现是清空当月在线时间的计划任务在某一错误时刻被执行。


就本帖分析下计划任务的实现过程,方便用户排查错误。

数据库结构:

论坛内现有的计划任务数据被保存在pre_common_cron表中,表中数据与论坛后台计划任务列表中的数据一致。
weekday字段为X表示每周星期X执行计划任务,day字段为X表示每月X日执行计划任务。X为-1表示不限制,即每天都执行计划任务。

执行计划任务:

执行计划任务在class_core.php中,初始化计划任务的函数_init_cron()中

  1. function _init_cron() {
  2.                 $ext = empty($this->config['remote']['on']) || empty($this->config['remote']['cron']) || APPTYPEID == 200;
  3.                 if($this->init_cron && $this->init_setting && $ext) {
  4.                         if($this->var['cache']['cronnextrun'] <= TIMESTAMP) {//判断当前是否有计划任务出于待执行状态
  5.                                 require_once libfile('class/cron');
  6.                                 discuz_cron::run();//执行计划任务
  7.                         }
  8.                 }
  9.         }


计划任务执行函数discuz_cron::run()

  1. function run($cronid = 0) {
  2.  
  3.                 global $_G;
  4.                 $timestamp = TIMESTAMP;
  5.                 $cron = DB::fetch_first("SELECT * FROM ".DB::table('common_cron')."
  6.                                 WHERE ".($cronid ? "cronid='$cronid'" : "available>'0' AND nextrun<='$timestamp'")."
  7.                                 ORDER BY nextrun LIMIT 1"); //取出一条符合执行条件的计划任务
  8.  
  9.                 $processname ='DZ_CRON_'.(empty($cron) ? 'CHECKER' : $cron['cronid']);
  10.  
  11.                 if($cronid && !empty($cron)) { //为了手动执行计划任务解锁
  12.                         discuz_process::unlock($processname);
  13.                 }
  14.  
  15.                 if(discuz_process::islocked($processname, 600)) { //检查计划任务进程是否上锁
  16.                         return false;
  17.                 }
  18.  
  19.                 if($cron) {  //计划任务执行部分
  20.  
  21.                         $cron['filename'] = str_replace(array('..', '/', '\\'), '', $cron['filename']);
  22.                         $cronfile = DISCUZ_ROOT.'./source/include/cron/'.$cron['filename'];
  23.  
  24.                         $cron['minute'] = explode("\t", $cron['minute']);
  25.                         discuz_cron::setnextime($cron); //根据后台设置,更新该计划任务执行的时间
  26.  
  27.                         @set_time_limit(1000);
  28.                         @ignore_user_abort(TRUE); //设置与客户机断开不会终止脚本的执行
  29.  
  30.                         if(!@include $cronfile) { //执行具体计划任务程序
  31.                                 return false;
  32.                         }
  33.                 }
  34.  
  35.                 discuz_cron::nextcron(); //设置最近一次计划任务执行的时间
  36.                 discuz_process::unlock($processname); //解锁进程
  37.                 return true;
  38.         }


注意:
每一个入口文件,如forum.php,space.php都有计划任务执行的入口,但打开一次页面只执行一条计划任务。

总结:
计划任务涉及的文件并不多,如果计划任务出现异常,通常只需要将class_core.php,class_cron.php重新上传覆盖即可。


相关评论

本站资源来自互联网收集,仅供用于学习和交流,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解! 

侵权删帖/违法举报/投稿等事物联系邮箱:adminad@email.cn

51La