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学习资料汇总与网址
Mar 16 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
php启用sphinx全文搜索的实现方法
Dec 24 PHP
如何使用php脚本给html中引用的js和css路径打上版本号
Nov 18 PHP
php面向对象值单例模式
May 03 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
Nov 03 PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 PHP
PHP一个简单的无需刷新爬虫
Jan 05 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 PHP
php适配器模式简单应用示例
Oct 23 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
Nov 21 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 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
php5.3 注意事项说明
2013/07/01 PHP
php递归获取目录内文件(包含子目录)封装类分享
2013/12/25 PHP
PHP Reflection API详解
2015/05/12 PHP
简单谈谈 php 文件锁
2017/02/19 PHP
PHP创建XML的方法示例【基于DOMDocument类及SimpleXMLElement类】
2019/09/10 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
一些有用的JavaScript和jQuery的片段分享
2011/08/23 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
js无刷新操作table的行和列
2014/03/27 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
详解AngularJS中的filter过滤器用法
2016/01/04 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
浅析angularJS中的ui-router和ng-grid模块
2016/05/20 Javascript
jQuery1.9+中删除了live以后的替代方法
2016/06/17 Javascript
jQuery+ajax实现实用的点赞插件代码
2016/07/06 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
深入探索VueJS Scoped CSS 实现原理
2019/09/23 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
[04:32]DOTA2著名解说配音敌法师 现场专访海涛怒切假腿
2013/12/20 DOTA
python实现自动更换ip的方法
2015/05/05 Python
Python上下文管理器和with块详解
2017/09/09 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
HTML5实现页面切换激活的PageVisibility API使用初探
2016/05/13 HTML / CSS
财务经理岗位职责
2013/11/09 职场文书
司机职责范本
2014/03/08 职场文书
雷锋的观后感
2015/06/10 职场文书
企业管理制度设计时要注意的几种“常见病”!
2019/04/19 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
python字符串常规操作大全
2021/05/02 Python
利用js实现简单开关灯代码
2021/11/23 Javascript
Python Pygame实战在打砖块游戏的实现
2022/03/17 Python