php版本的cron定时任务执行器使用实例


Posted in PHP onAugust 19, 2014

本文实例讲述了php版本的cron定时任务执行器使用方法,是非常实用的一个功能应用。具体方法如下:

由于服务器crontab只能精确到分钟,因此程序的起点也是分钟。

该功能一共包括三个部分:

一、配置文件:

配置文件是用来返回要执行的定时任务文件,注意一下*的使用就行了,有两个模式,就是

Y-m-d H:i        :年 月 日 时 分
N H:i            :星期(1 - 7|周一 - 周日) 时 分

配置文件croning.php如下:

/**
 * 任务管理器配置文件
 * 
 * Y-m-d H:i    :年 月 日 时 分
 * N H:i      :星期(1 - 7|周一 - 周日) 时 分
 * 
 * 2013-12-25 19:49 : 固定时间,只执行一次
 * *-12-25 20:00  : 每年的某月某日 某小时某分
 * 2013-12-25 *:49 : 某天的每个小时的49分都执行一次
 * *-*-* 20:00   : 每天晚上8点0分执行
 * *-*-* *:*    :每分钟都在执行
 * 2 20:01     :每周二的20:01时间都执行一次
 * 
 * * 号表示当前位置的任何时间。以此类推....
 * 
 * 格式:
 * array(
 *   key=>value,
 * );
 * 
 * 说明:
 * key是定义的执行时间,value是执行的文件,可以是数组或者字符串,当同一时间有多个任务执行时,为了避免key的覆盖请用一维数组模式。
 * 
 */
return array(
  '2013-12-25 19:49'=>'123.php',
  '2013-12-* 18:00'=>'456.php',
  '1 08:00'=>'6546.php',
  '*-12-25 19:49'=>array('444.php','456.php')
);

二、服务器cronjob主要执行的php文件:

该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'); //定时执行文件目录
require CORE_ROOT . '/Common.php';
require CORE_ROOT . '/AHA.php'; //载入框架核心文件
spl_autoload_register(array('Common', 'loadClassFile'));
AHA::initConfig(include APP_ROOT . '/_config/inc.php'); //载入配置文件
//不存在执行的配置文件时
if (!file_exists(APP_ROOT . '/_config/croning.php')) {
  exit('cron failed,please check the cron config!');
}

$__all = include APP_ROOT . '/_config/croning.php';
//数据不合法时
if (!$__all || !is_array($__all)) {
  exit('cron failed,please check the cron config!');
}

$__echo = true; //是否输出到屏幕

$__time_star = microtime(true);
$__now = time();

Common::fileLog(DATA_ROOT . '/log/cron_index.log', '执行cron开始******************************' . date('Y-m-d H:i:s', $__now) . '******************************', $__echo);

$__onFile = array();
if ($__all) {
  foreach ($__all as $__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 ($__onFile as $__value) {
    if (file_exists(ONING_ROOT . '/' . $__value)) {
      $__time_star2 = microtime(true);
      Common::fileLog(DATA_ROOT . '/log/cron_index.log', $__value . ' 执行开始----------' . date('Y-m-d H:i:s') . '-----------', $__echo);
      include ONING_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-d H:i:s') . '*****************' . "\n\n", $__echo);

/**
 * 处理正则结果并返回该文件是否是当时要执行
 * @param array $match   正则结果,数组
 * @param integer $__now  当时时间戳
 * @return bool
 */
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('N H: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-d H:i', $__now) === date($argc, $__now) ? true : false;
  }
  return $back;
}

三、众多要执行的定时文件:

这个是真正要执行的代码:包括采集,数据整理与分析等,文件路径写到配置文件的value中去。同一时间执行的文件,记得一维数组模式。

感兴趣的朋友可以调试运行一下本文实例程序,相信会有很大的收获。

PHP 相关文章推荐
PHP的面向对象编程
Oct 09 PHP
php缓存技术介绍
Nov 25 PHP
我的php学习笔记(毕业设计)
Feb 21 PHP
探讨PHP中this,self,parent的区别详解
Jun 08 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
使用php伪造referer的方法 利用referer防止图片盗链
Jan 20 PHP
php绘图之加载外部图片的方法
Jan 24 PHP
php简单的上传类分享
May 15 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
Aug 31 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
Apr 11 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
Aug 05 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
PHP框架Swoole定时器Timer特性分析
Aug 19 #PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 #PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
Aug 19 #PHP
php解析json数据实例
Aug 19 #PHP
php中使用array_filter()函数过滤空数组的实现代码
Aug 19 #PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
Aug 19 #PHP
php中用memcached实现页面防刷新功能
Aug 19 #PHP
You might like
php 启动时报错的简单解决方法
2014/01/27 PHP
PHPExcel实现的读取多工作表操作示例
2020/04/14 PHP
Domino中运用jQuery读取视图内容的方法
2009/10/21 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
通过js来制作复选框的全选和不选效果
2014/05/22 Javascript
javascript实现的一个随机点名功能
2014/08/26 Javascript
js简单抽奖代码
2015/01/16 Javascript
js正则表达式中exec用法实例
2015/07/23 Javascript
可以浮动某个物体的jquery控件用法实例
2015/07/24 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
正则表达式(语法篇推荐)
2016/06/24 Javascript
JS中如何比较两个Json对象是否相等实例代码
2016/07/13 Javascript
node.js中EJS 模板快速入门教程
2017/05/08 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
Vue源码之关于vm.$delete()/Vue.use()内部原理详解
2019/05/01 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
[06:44]2014DOTA2国际邀请赛-钥匙体育馆开战 开幕式振奋人心
2014/07/19 DOTA
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
Jacobi迭代算法的Python实现详解
2019/06/29 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
pytorch制作自己的LMDB数据操作示例
2019/12/18 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
python模拟实现分发扑克牌
2020/04/22 Python
Python configparser模块操作代码实例
2020/06/08 Python
电气自动化个人求职信范文
2014/02/03 职场文书
冰淇淋店的创业计划书
2014/02/07 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
党的群众路线个人对照检查材料
2014/09/23 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
利用python做表格数据处理
2021/04/13 Python
SpringBoot系列之MongoDB Aggregations用法详解
2022/02/12 MongoDB