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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

X2 计划任务执行机制解析

[复制链接]
viswow 发表于 2011-4-29 10:59:02 | 显示全部楼层 |阅读模式
*************************************************
** 本教程基于版本:Discuz! X 2.0                                         **
*************************************************

1. Discuz! X2 即将到来新机制介绍:
在  Discuz! X2 中的计划任务引用了新的外部控制机制,以前的机制都是在程序允许的时候,需要有用户或者蜘蛛访问论坛,才能够执行计划任务。现在,在  Discuz! X2 中引如新的远程机制,可以在服务器上使用服务器的计划任务或者服务器的独立进程来监控执行论坛计划任务,也就可以避免在访问用户较少的时候计划任务执行时间不准确的问题了。
目前改改进已经开始,但是尚为投入到真是环境使用当中,等真正可用的时候将有新的教程推出

2.计划任务执行机制
不管是新的触发机制还是原来的触发机制,在执行计划任务的时候都是同一个机制来完成的。下面就给大家介绍一下 Discuz! 的计划任务执行类:discuz_cron

所在文件:source\class\class_cron.php
调用位置:source\class\class_core.php
  1. function _init_cron() {
复制代码
此处在没有做外部控制服务之前一定要保证配置文件中的 $_config['remote']['on'] 项 为0  否则将不执行计划任务。
其中 $this->var['cache']['cronnextrun'] 的值是选取所有计划任务中,将在最近时刻执行的那个计划任务的下次执行时间。来自:
  1. function nextcron() {
复制代码

真正计划任务的执行是调用的  discuz_cron::run(); 方法。
  1. function run($cronid = 0) {.......}
复制代码
这个方法可以指定 cronid 执行执行某个计划任务,或者是不带参数,将按照正常的执行直接来执行计划任务。
在执行的时候
  1. $cron = DB::fetch_first("SELECT * FROM ".DB::table('common_cron')." WHERE ".($cronid ? "cronid='$cronid'" : "available>'0' AND nextrun<='$timestamp'")." ORDER BY nextrun LIMIT 1");
复制代码
此条 SQL 将从数据库中取出下次即将执行的计划任务的信息。

  1. if(discuz_process::islocked($processname, 600)) {
复制代码
检查是否计划人物已经在执行了,防止高并发下出现同时执行的问题。
  1. if($cron) {
复制代码
按照查询出来的计划任务的信息,读取计划任务的脚本文件,同时设置该计划任务的下次执行时间并执行计划任务。
  1. discuz_cron::nextcron();
复制代码

执行完毕设置总体的下个计划任务将要执行的时间,并解锁计划任务执行进程。
这样一次执行计划任务的操作就完成了。





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

本版积分规则

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

GMT+8, 2024-11-17 08:37 , Processed in 0.020178 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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