本文实例讲述了php版本的cron定时任务执行器使用方法,是非常实用的一个功能应用。具体方法如下:
由于服务器crontab只能精确到分钟,因此程序的起点也是分钟。
该功能一共包括三个部分:
一、配置文件:
配置文件是用来返回要执行的定时任务文件,注意一下*的使用就行了,有两个模式,就是
Y-m-dH:i :年月日时分
NH:i :星期(1-7|周一-周日)时分
配置文件croning.php如下:
/**
*任务管理器配置文件
*
*Y-m-dH:i:年月日时分
*NH:i:星期(1-7|周一-周日)时分
*
*2013-12-2519:49:固定时间,只执行一次
**-12-2520:00:每年的某月某日某小时某分
*2013-12-25*:49:某天的每个小时的49分都执行一次
**-*-*20:00:每天晚上8点0分执行
**-*-**:*:每分钟都在执行
*220:01:每周二的20:01时间都执行一次
*
**号表示当前位置的任何时间。以此类推....
*
*格式:
*array(
*key=>value,
*);
*
*说明:
*key是定义的执行时间,value是执行的文件,可以是数组或者字符串,当同一时间有多个任务执行时,为了避免key的覆盖请用一维数组模式。
*
*/
returnarray(
'2013-12-2519:49'=>'123.php',
'2013-12-*18:00'=>'456.php',
'108:00'=>'6546.php',
'*-12-2519:49'=>array('444.php','456.php')
);
二、服务器cronjob主要执行的php文件:
该php文件主要处理与分析哪些文件是当时可以执行的。以及写入执行记录文件。
/**
*cron任务统一执行的文件,没有超时
*/
header('Content-Type:text/html;charset=utf-8');
set_time_limit(0);
define('APP_ROOT',dirname(__FILE__));
define('AHA_ROOT',dirname(APP_ROOT));
define('CORE_ROOT',AHA_ROOT.'/__core');
define('DATA_ROOT',AHA_ROOT.'/data');
define('MODEL_ROOT',APP_ROOT.'/model');
define('ONING_ROOT',APP_ROOT.'/oning');//定时执行文件目录
requireCORE_ROOT.'/Common.php';
requireCORE_ROOT.'/AHA.php';//载入框架核心文件
spl_autoload_register(array('Common','loadClassFile'));
AHA::initConfig(includeAPP_ROOT.'/_config/inc.php');//载入配置文件
//不存在执行的配置文件时
if(!file_exists(APP_ROOT.'/_config/croning.php')){
exit('cronfailed,pleasecheckthecronconfig!');
}
$__all=includeAPP_ROOT.'/_config/croning.php';
//数据不合法时
if(!$__all||!is_array($__all)){
exit('cronfailed,pleasecheckthecronconfig!');
}
$__echo=true;//是否输出到屏幕
$__time_star=microtime(true);
$__now=time();
Common::fileLog(DATA_ROOT.'/log/cron_index.log','执行cron开始******************************'.date('Y-m-dH:i:s',$__now).'******************************',$__echo);
$__onFile=array();
if($__all){
foreach($__allas$__key=>$__value){
if(strpos($__key,'-')===false){//每周的处理
preg_match('@^([\d\*]+)([\d\*]+):([\d\*]+)$@U',$__key,$match);
}else{//正常的处理
preg_match('@^([\d\*]+)\-([\d\*]+)\-([\d\*]+)([\d\*]+):([\d\*]+)$@U',$__key,$match);
}
if($match){
array_shift($match);
if(__getPreg($match,$__now)){//是否是要执行的文件
$__onFile=array_merge($__onFile,is_array($__value)?$__value:array($__value));
}
}
}
}
if($__onFile){
$__onFile=array_unique($__onFile);
foreach($__onFileas$__value){
if(file_exists(ONING_ROOT.'/'.$__value)){
$__time_star2=microtime(true);
Common::fileLog(DATA_ROOT.'/log/cron_index.log',$__value.'执行开始----------'.date('Y-m-dH:i:s').'-----------',$__echo);
includeONING_ROOT.'/'.$__value;
Common::fileLog(DATA_ROOT.'/log/cron_index.log',$__value.'执行结束(花费时间:'.((microtime(true)-$__time_star2)*1000).'ms)-------------',$__echo);
}
}
}
Common::fileLog(DATA_ROOT.'/log/cron_index.log','执行cron结束(一共执行时间:'.((microtime(true)-$__time_star)*1000).'ms)*************'.date('Y-m-dH:i:s').'*****************'."\n\n",$__echo);
/**
*处理正则结果并返回该文件是否是当时要执行
*@paramarray$match正则结果,数组
*@paraminteger$__now当时时间戳
*@returnbool
*/
function__getPreg($match,$__now){
$back=false;
list($__Y,$__m,$__d,$__N,$__H,$__i)=explode('-',date('Y-m-d-N-H-i',$__now));
$argc=count($match);
if($argc===3){
$argc=$match[0]==='*'?$__N:$match[0];
$argc.='';
$argc.=$match[1]==='*'?$__H:$match[1];
$argc.=':';
$argc.=$match[2]==='*'?$__i:$match[2];
$back=date('NH:i',$__now)===date($argc,$__now)?true:false;
}elseif($argc===5){
$argc=$match[0]==='*'?$__Y:$match[0];
$argc.='-';
$argc.=$match[1]==='*'?$__m:$match[1];
$argc.='-';
$argc.=$match[2]==='*'?$__d:$match[2];
$argc.='';
$argc.=$match[3]==='*'?$__H:$match[3];
$argc.=':';
$argc.=$match[4]==='*'?$__i:$match[4];
$back=date('Y-m-dH:i',$__now)===date($argc,$__now)?true:false;
}
return$back;
}
三、众多要执行的定时文件:
这个是真正要执行的代码:包括采集,数据整理与分析等,文件路径写到配置文件的value中去。同一时间执行的文件,记得一维数组模式。
感兴趣的朋友可以调试运行一下本文实例程序,相信会有很大的收获。
您可能感兴趣的文章:详解PHP实现定时任务的五种方法详解PHP执行定时任务的实现思路PHP定时执行任务的3种方法详解如何使用纯PHP实现定时器任务(Timer)PHP定时执行任务实现方法详解(Timer)php定时执行任务设置详解php计划任务之ignore_user_abort函数实现方法PHP实现定时执行任务的方法PHP中使用sleep函数实现定时任务实例分享如何离线执行php任务