Files
xinhu/webmain/model/taskModel.php
2022-09-29 15:34:08 +08:00

372 lines
9.7 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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;
}
}