<?php
namespace imcat;

// 计划任务类
 
class comCron{
    
    public 
$stamp 0
    public 
$rgap '8m'//时间间隔:5-10min
    
public $frun '/store/_rlock_cron.txt';
    
    public 
$db NULL
    public 
$tab 'bext_cron'
    public 
$jobs = array(); 
    public 
$jres = array(); 

    
// 
    
static function run($file=''){
        
$row['kid'] = $file;
        
$re self::rone($row);
    }

    
//function __destory(){  }
    
function __construct($upd=1){ 
        
$this->init();
        
$this->rlist();
        
$upd && $this->update();
    }
    
    
// init
    
function init(){
        
$this->db glbDBObj::dbObj();
        
$this->stamp $_SERVER["REQUEST_TIME"];
        if(!
extCache::cfGet($this->frun,$this->rgap)){ 
            
$whr " exnext<'".$this->stamp."' AND enable=1 AND hkflag=0"
            
$this->jobs $this->db->table($this->tab)->where($whr)->select();
        } 
    }
    
    
// 运行列表
    
function rlist(){
        if(!empty(
$this->jobs)){
            foreach(
$this->jobs as $row){
                
$rdo $this->rone($row);
                
$next $this->rnext($row,$rdo);
                
$this->jres[$row['kid']] = array(
                    
'rdo' => $rdo
                    
'next' => $next,
                );
            }
        }
    }
    
    
// 计算下次运行时间
    // excunit=w,d,h  excycle=1-127
    
function rnext($row,$rdo){
        
$ctime extCache::CTime($row['excycle'].$row['excunit']);
        
$stfix date('i')*60 date('s'); $stfix $stfix 1800 ? (3600-$stfix) : ($stfix-3600); //修正整点
        
$exsecs intval(substr($row['exsecs'],0,2))*60 intval(substr($row['exsecs'],3,2)); 
        
$next $this->stamp $stfix $ctime $exsecs
        return 
$next;
    }
    
    
// update
    
function update(){
        if(empty(
$this->jres)) return;
        foreach(
$this->jres as $file=>$row){
            
$data = array('exlast'=>$this->stamp);
            if(
$row['rdo']=='pass'$data['exnext'] = $row['next'];
            
$this->db->table($this->tab)->data($data)->where("kid='$file'")->update(0); 
        } 
        
comFiles::put(DIR_DTMP.$this->frun,date('Y-m-d H:i:s'));
    }

    
    
// 运行一个任务
    
static function rone($row,$data=array()){
        
$db glbDBObj::dbObj();
        
$stamp $_SERVER["REQUEST_TIME"];
        
$fp1 DIR_ROOT."/extra/cron/{$row['kid']}.php"
        
$fp2 DIR_IMCAT."/adpt/cron/{$row['kid']}.php"
        if(!empty(
$row['cfgs'])){
            
// run-sql
        
}elseif(file_exists($fp1)){
            include_once 
$fp1;
        }elseif(
file_exists($fp2)){
            include_once 
$fp2;
        }else{
            
// logger???
        
}
        return empty(
$rdo) ? 'fail' $rdo;
    }

}

/*

UPDATE bext_cron
    SET exnext = CASE kid
        WHEN '1' THEN '3'
        WHEN 2 THEN 4
        WHEN 3 THEN 5
    END,
    exlast = CASE kid
        WHEN 1 THEN '{$this->stamp}'
        WHEN 2 THEN 'New Title 2'
        WHEN 3 THEN 'New Title 3'
    END
WHERE id IN (1,2,3)

$display_order = array(
    1 => 4,
    2 => 1,
    3 => 2,
    4 => 3,
    5 => 9,
    6 => 5,
    7 => 8,
    8 => 9
);
$ids = implode(',', array_keys($display_order));
$sql = "UPDATE categories SET display_order = CASE id ";
foreach ($display_order as $id => $ordinal) {
    $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql;

*/