| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372 |
- <?php
- class taskClassModel extends Model
- {
- /**
- * 读取计划任务运行列表
- */
- public function getrunlist($dt='', $lx=0, $ntime=0)
- {
- if($dt=='')$dt = $this->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<count($tar)-1;$i++){
- $i1 = $tar[$i];
- $i2 = $tar[$i+1];
- if($ni>=$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;
- }
- }
|