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 相关文章推荐
一个简单的自动发送邮件系统(三)
Oct 09 PHP
使用php4加速网络传输
Oct 09 PHP
php定时计划任务与fsockopen持续进程实例
May 23 PHP
CI(CodeIgniter)框架配置
Jun 10 PHP
迁移PHP版本到PHP7
Feb 06 PHP
php检测apache mod_rewrite模块是否安装的方法
Mar 14 PHP
PHP生成word文档的三种实现方式
Nov 14 PHP
php读取和保存base64编码的图片内容
Apr 22 PHP
PHP 年月日的三级联动实例代码
May 24 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
php 调用百度sms来发送短信的实现示例
Nov 02 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
Oct 17 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实现最简单的MVC框架实例教程
2014/09/08 PHP
php绘制一个扇形的方法
2015/01/24 PHP
Codeigniter中集成smarty和adodb的方法
2016/03/04 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
Javascript 同时提交多个Web表单的方法
2009/02/19 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
jquery实现增加删除行的方法
2015/02/03 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
什么是Vue.js框架 为什么选择它?
2017/10/17 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
原生JS 实现的input输入时表格过滤操作示例
2019/08/03 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
Python导入oracle数据的方法
2015/07/10 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
struct和class的区别
2015/11/20 面试题
领导的自我鉴定
2013/12/28 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
淘宝网店营销策划书
2014/01/11 职场文书
写演讲稿要注意的六件事
2014/01/14 职场文书
教师绩效考核方案
2014/01/21 职场文书
医院搬迁方案
2014/06/14 职场文书
党员学习党的群众路线思想汇报(5篇)
2014/09/10 职场文书
钳工实训报告总结
2014/11/04 职场文书
幼儿园门卫安全责任书
2015/05/08 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
Python自动化之批量处理工作簿和工作表
2021/06/03 Python
Redis模仿手机验证码发送的实现示例
2021/11/02 Redis
使用canvas仿Echarts实现金字塔图的实例代码
2021/11/11 HTML / CSS