rock->date; $fields = '`id`,`url`,`type`,`time`'; if($lx==1)$fields.=',`name`'; $rows = $this->getrows('`status`=1 order by `sort`', $fields); $runa = array(); $sdts = strtotime($dt); $edts = strtotime($dt.' 23:59:59'); if($ntime==0)$ntime = time(); $ntime = $ntime-20;//稍微减一下防止出现跳过的 $brows = array(); $dtobj = c('date'); $w = (int)date('w', $sdts);if($w==0)$w=7;//星期7 foreach($rows as $k=>$rs){ $ate = explode(',', $rs['type']); $ati = explode(',', $rs['time']); if(count($ate)!=count($ati))continue; $len = count($ate); $rs['adminid'] = 1; $rs['atype'] = 'runurl'; $rs['urllu'] = $rs['url']; $rs['url'] = $this->showgeurl($rs['url'],$rs['id'], $lx); for($i=0;$i<$len;$i++){ $rs['type'] = $ate[$i]; $rs['time'] = $ati[$i]; $brows[] = $rs; } } foreach($brows as $k=>$rs){ $type = $rs['type']; $atime = $rs['time']; $jg = (int)str_replace(array('d','i','h','m','w'),array('','','','',''), $type); if($jg==0)$jg=1; $type = str_replace($jg,'', $type); $jgs = $jg; if($jg<10)$jgs = '0'.$jg.''; $time = ''; //每天 if($type=='d'){ $time = $dt.' '.$rs['time']; $rs['runtimes'] = $time; $rs['runtime'] = strtotime($time); $runa[] = $rs; } //分钟 if($type=='i'){ $ges = $jg*60; for($i=$sdts;$i<=$edts;$i=$i+$ges){ $rs['runtimes'] = date('Y-m-d H:i:s', $i); $rs['runtime'] = $i; $runa[] = $rs; } } //小时 if($type=='h'){ for($i=0;$i<=23;$i=$i+$jg){ $time = date('Y-m-d H:'.$atime.'', $sdts+$i*3600); $rs['runtimes'] = $time; $rs['runtime'] = strtotime($time); $runa[] = $rs; } } //每月 if($type=='m'){ $time = date('Y-m-'.$atime.''); $rs['runtimes'] = $time; $rs['runtime'] = strtotime($time); $runa[] = $rs; } //周 if($type=='w' && $jg==$w){ $time = date('Y-m-d '.$atime.''); $rs['runtimes'] = $time; $rs['runtime'] = strtotime($time); $runa[] = $rs; } //每年 if($type=='y'){ $time = date('Y-'.$atime.''); $rs['runtimes'] = $time; $rs['runtime'] = strtotime($time); $runa[] = $rs; } } $brun = array(); foreach($runa as $k=>$rs){ $_runti = $rs['runtime']; if($_runti >= $ntime && $_runti<=$edts)$brun[]=$rs; } $brun = c('array')->order($brun, 'runtime','asc'); return $brun; } //$lx=2必须使用本地地址 private function gettaskurl($lx=0) { $turl = getconfig('taskurl'); if($turl=='' || $lx==2)$turl = getconfig('localurl', URL); return $turl; } //判断设置本地地址是否可以使用 public function pdlocal($urla='') { if($urla=='')$urla= $this->gettaskurl(); $url = $urla.'task.php?m=day|runt&a=getitle'; if($urla != URL){ if(c('curl')->getcurl($url) != TITLE)return returnerror('设置的本地地址“'.$urla.'”不能使用,请到[系统→系统工具→系统设置]下重新设置'); } return returnsuccess(); } //获取运行url,$lx=2必须使用本地地址 private function showgeurl($url, $id, $lx=0) { if(contain($url, 'http://') || contain($url, 'https://')){ }else{ $aurl = explode(',', $url); $turl = $this->gettaskurl($lx); $yurl = 'task.php?m='.$aurl[0].'|runt&a='.arrvalue($aurl, 1, 'run').'&runid='.$id.''; $url = ''.$turl.''.$yurl.''; } return $url; } //基本运行 弃用 public function baserun($mid=0,$gtimes='') { $where = ''; if($mid>0)$where='and id='.$mid.''; $rows = $this->getrows('`status`=1 '.$where.' order by `sort`','`id`,`url`,`type`,`time`,`lastdt`'); $dt = $this->rock->date; if($gtimes=='')$gtimes = date('H:i:s'); $time = strtotime($dt.' '.$gtimes); $jgs = 5; foreach($rows as $k=>$rs){ $ybbo = false; $stime = $this->getruntime($dt, $rs['type'], $rs['time'], $rs['lastdt']); if($stime > 0){ if($time>=$stime-$jgs && $time<=$stime+$jgs){ $ybbo = true; } } if($ybbo || $mid>0){ $state = '2'; $url = $this->showgeurl($rs['url'], $rs['id']); $cont = c('curl')->getcurl($url); if($cont=='success')$state='1'; $this->update(array( 'state' => $state, 'lastdt'=> $this->rock->now, 'lastcont' => $cont ), $rs['id']); } } } private function getruntimes($dt, $type, $time, $lastdt) { $stime = 0;$sj = ''; if($type=='d'){ $sj = $dt.' '.$time; } if($type=='h'){ } if($type=='i'){ } if($sj!=''){ $stime = strtotime($sj); } return $stime; } private function getruntime($dt, $type, $time, $lastdt) { $stime = 0; if(!$this->isempt($type) && !$this->isempt($time)){ $atype = explode(',', $type); $atime = explode(',', $time); $len1 = count($atype); $len2 = count($atime); if($len1 == $len2){ for($i=0; $i<$len1; $i++){ $stime = $this->getruntimes($dt, $atype[$i], $atime[$i], $lastdt); if($stime>0)break; } } } return $stime; } private function tasklistpath($lx=0) { $str = ''.UPDIR.'/logs/tasklist.json'; if($lx==1)return $str; return ''.ROOT_PATH.'/'.$str.''; } /** * 清空 */ public function cleartask() { @unlink($this->tasklistpath()); } //读取下一个5分钟时间 private function getnextfz() { $time = time(); $ni = date('i', $time); $tar = array(0,5,10,15,20,25,30,35,40,45,50,55,60); $gi = 0; for($i=0;$i=$i1 && $ni<$i2){ $gi = $i2; break; } } if($gi==60){ $date = date('Y-m-d H:00:00', $time+600); }else{ $date = date('Y-m-d H:'.$gi.':00', $time); } return strtotime($date); } //开启发送运行任务 public function sendstarttask() { $turl = $this->gettaskurl(); $option = m('option'); $this->reimtype = $option->getval('reimservertype'); //node版本 if($this->reimtype=='1'){ $url = ''.$turl.'task.php?m=runt&a=task'; $runtime= $this->getnextfz(); $reim = m('reim'); if(!isempt(getconfig('phppath')) && contain($reim->serverpushurl, '127.0.0.1')){ $url= 'runt,task'; } $recID = $option->getval('reimrecidsystem','rockxinhu'); $keynum = 'service_'.$recID.''; $len = (int)$option->getval($keynum,'0'); if($len<=0){ $len = strlen($url)+rand(1000,9999); $option->setval($keynum, $len); } $barr = c('rockqueue')->push($url, array('rtype'=>'queue','dwnum'=>'dev','nolog'=>'1','runtime'=>$runtime), $runtime, $len); if(!COMPANYNUM && getconfig('platdwnum')){ $creaar = m('company')->getall('`iscreate`=1'); foreach($creaar as $k=>$rs){ $url1 = $url; if(substr($url,0,4)=='http' && !isempt($rs['yuming']))$url1 = $this->tihuanurl($url1, $rs['yuming']); $barr = c('rockqueue')->push($url1, array('dwnum'=>$rs['num'],'nolog'=>'1','runtime'=>$runtime), $runtime, $len+1+$k); } } }else{ $url = ''.$turl.'task.php?m=runt&a=getlist'; $barr = m('reim')->pushserver('starttask', array( 'url' => $url )); } return $barr; } private function tihuanurl($url1, $yj) { $str = str_replace('/','@',str_replace('//', '@', $url1)); $urla = explode('@', $str); $nhur = $urla[1]; $url1 = str_replace('/'.$nhur.'/', '/'.$yj.'/', $url1); return $url1; } /** * 开启计划任务(自己服务端) */ public function starttask() { $barr = $this->sendstarttask(); if($this->reimtype=='1'){ $recID = m('option')->getval('reimrecidsystem','rockxinhu'); c('rockqueue')->pushtype('starturl',''.$this->gettaskurl().'task.php?m=runt&a=taskget', array( 'recid' => $recID )); } $this->cleartask(); return $barr; } //创建json数组 public function createjson($time) { $barr = $this->getrunlist($this->rock->date, 2, $time); $this->rock->createtxt($this->tasklistpath(1), json_encode($barr)); return $barr; } /** * cli 运行每5分钟运行的,运行curl的 */ public function runjsonlist($time) { $barr = array(); $fstr = ''; $fpath = $this->tasklistpath(); $dt = date('Y-m-d', $time); if(file_exists($fpath)){ $lastdt = date('Y-m-d H:i:s',filemtime($fpath));//最后修改的时间 $editdt = date('Y-m-d H:i:s',filectime($fpath));//上次修改时间 if(contain($lastdt, $dt) && contain($editdt, $dt))$fstr = @file_get_contents($fpath); } if(isempt($fstr)){ $barr = $this->createjson($time); m('option')->setval('systaskrun', $this->rock->now);//记录运行时间 }else{ $barr = json_decode($fstr, true); } $ntime = strtotime(date('Y-m-d H:i:00', $time)); $yunarr = array(); foreach($barr as $k=>$rs){ if($rs['runtime']==$ntime){ $yunarr[] = $rs; } } return $yunarr; } //获取运行列表 public function getlistrun($dt) { $brun = $this->getrunlist($dt); $this->sbarr = array(); foreach($brun as $k=>$rs){ $key = $this->bsdeitmes($rs['runtime'],0); unset($rs['id']); unset($rs['time']); unset($rs['type']); unset($rs['runtimes']); unset($rs['runtime']); $rs['from'] = '[recid]'; $this->sbarr[$key] = $rs; } $barr = array(); foreach($this->sbarr as $key=>$rs){ $barr[$key] = json_encode($rs); } return $barr; } private function bsdeitmes($time, $oi) { $xu = $time+$oi; $key= '[recid]'.$xu.''; if(isset($this->sbarr[$key])){ $key = $this->bsdeitmes($time, $oi+1); } return $key; } }