由于服务器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
/**
* 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中去。同一时间执行的文件,记得一维数组模式。

来源:http://www.pangyiguang.com/a_76

继续转 [转]php版本的cron定时任务执行器的更多相关文章

  1. Go cron定时任务的用法

    cron是什么 cron的意思就是:计划任务,说白了就是定时任务.我和系统约个时间,你在几点几分几秒或者每隔几分钟跑一个任务(job),就那么简单. cron表达式 cron表达式是一个好东西,这个东 ...

  2. 使用 cron 定时任务实现 war 自动化发布

    autoRelease.sh #!/bin/sh /home/tomcat/bin/shutdown.sh echo "tomcat stoped" cd /home/tomcat ...

  3. cron定时任务介绍

    什么是cron? Cron是linux系统中用来定期执行或指定程序任务的一种服务或软件.与它相关的有两个工具:crond 和 crontab.crond 就是 cron 在系统内的宿主程序,cront ...

  4. linux ,cron定时任务 备份mysql数据库

    cron 定时任务执行备份脚本文件 backup.sh #!/bin/bash USER="root" PASSWORD="xxxxx" DATABASE=&q ...

  5. 珠峰培训node 珠峰爬虫| cron 定时任务

    1.cron 定时任务 CronJob var CronJob = require('cron').CronJob; // 秒 分钟 时 天

  6. Cron定时任务应用到Thinkphp – 贤生博客

    Cron定时任务应用到Thinkphp 安装crontab: yum install crontabs 关于cron的一些命令: /sbin/service crond start //启动服务 /s ...

  7. linux下的cron定时任务知识梳理

    1 cron定时任务 1.1 cron介绍 为什么需要cron定时任务? 1)cron服务在安装完Linux系统后就默认就存在,主要用来定期执行命令或定期执行指定的应用程序; 2)cron服务默认情况 ...

  8. .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件

    常用的定时任务组件有 Quartz.Net 和 Hangfire 两种,这两种是使用人数比较多的定时任务组件,个人以前也是使用的 Hangfire ,慢慢的发现自己想要的其实只是一个能够根据 Cron ...

  9. .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件 (Timer 优化版)

    在上个月写过一篇 .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件 的文章,当时 CronSchedule 的实现是使用了,每个服务都独立进入到一个 while 循环中,进行定期扫描是否 ...

随机推荐

  1. Target runtime com.genuitec.runtime.generic.jee50 is not defined

    导入别人的工程,发现报错Target runtime com.genuitec.runtime.generic.jee50 is not defined   解决方法:1. 找到工程目录的.setti ...

  2. php 生成 Json

    php 生成 Json 部分 <?php $arr_result = array(); //返回值 $arr_result['result'] = '0'; $arr_result['calle ...

  3. SharedPreference注册OnSharedPreferenceChangeListener一直无法回调问题

    注册代码如下: SharedPreferences sp = getSharedPreferences("AndroidDemo", Context.MODE_PRIVATE); ...

  4. TDA - Thread Dump Analyzer (Java线程分析工具)

    TDA - Thread Dump Analyzer (Java线程分析工具)http://automationqa.com/forum.php?mod=viewthread&tid=2351 ...

  5. 调用 webapi的put和delete 报"Method Not Allowed" 405 错误。

    修改引用到webapi的Dll文件对应的项目的web.config 选择生成读写方法webapi会生成四个读写的方法(CRUD),两个获取数据的.一个更新.一个删除,默认情况下更新和删除是不对外开外的 ...

  6. WPF自定义控件

    一.ImageButton 1.继承ImageButtonButton,添加依赖属性 using System; using System.Windows; using System.Windows. ...

  7. JavaScript - 2个等号与3个等号的区别

    简言之,== equality 等同,=== identity 恒等. ==, 两边值类型不同的时候,要先进行类型转换,再比较. ===,不做类型转换,类型不同的一定不等. 或: = 赋值运算符 == ...

  8. (oracle/mysql)启停,导入导出,DB字符集

    ==================================================================================== DB启动停止 ======== ...

  9. Probabilistic Graphical Models

    http://innopac.lib.tsinghua.edu.cn/search~S1*chx?/YProbabilistic+Graphical+Models&searchscope=1& ...

  10. AC_Dream 1216 G - Beautiful People

    题意:有n个人每人有一个力气值Si,美丽值Bi,满足Bi>Bj&&Si>Sj 或者 Bi<Bj&&Si<Sj 的人可以一起参见晚会,问最多有多少 ...