PHP中实现crontab代码分享


Posted in PHP onMarch 26, 2015

1. 准备一个标准crontab文件 ./crontab

# m h dom mon dow command

* * * * * date > /tmp/cron.date.run

2. crontab -e 将此cron.php脚本加入系统cron

* * * * * /usr/bin/php cron.php

3. cron.php 源码

// 从./crontab读取cron项,也可以从其他持久存储(mysql、redis)读取

$crontab = file('./crontab');

$now = $_SERVER['REQUEST_TIME'];
foreach ( $crontab as $cron ) {

 $slices = preg_split("/[\s]+/", $cron, 6);

 if( count($slices) !== 6 ) continue;
 $cmd       = array_pop($slices);

 $cron_time = implode(' ', $slices);

 $next_time = Crontab::parse($cron_time, $now);

 if ( $next_time !== $now ) continue; 
 $pid = pcntl_fork();

 if ($pid == -1) {

  die('could not fork');

 } else if ($pid) {

  // we are the parent

  pcntl_wait($status, WNOHANG); //Protect against Zombie children

 } else {

      // we are the child

  `$cmd`;

  exit;

 }

}
/* https://github.com/jkonieczny/PHP-Crontab */

class Crontab {

   /**

 * Finds next execution time(stamp) parsin crontab syntax,

 * after given starting timestamp (or current time if ommited)

 *

 * @param string $_cron_string:

 *

 * 0 1 2 3 4

 * * * * * *

 * - - - - -

 * | | | | |

 * | | | | +----- day of week (0 - 6) (Sunday=0)

 * | | | +------- month (1 - 12)

 * | | +--------- day of month (1 - 31)

 * | +----------- hour (0 - 23)

 * +------------- min (0 - 59)

 * @param int $_after_timestamp timestamp [default=current timestamp]

 * @return int unix timestamp - next execution time will be greater

 * than given timestamp (defaults to the current timestamp)

 * @throws InvalidArgumentException

 */

    public static function parse($_cron_string,$_after_timestamp=null)

    {

        if(!preg_match('/^((\*(\/[0-9]+)?)|[0-9\-\,\/]+)\s+((\*(\/[0-9]+)?)|[0-9\-\,\/]+)\s+((\*(\/[0-9]+)?)|[0-9\-\,\/]+)\s+((\*(\/[0-9]+)?)|[0-9\-\,\/]+)\s+((\*(\/[0-9]+)?)|[0-9\-\,\/]+)$/i',trim($_cron_string))){

            throw new InvalidArgumentException("Invalid cron string: ".$_cron_string);

        }

        if($_after_timestamp && !is_numeric($_after_timestamp)){

            throw new InvalidArgumentException("\$_after_timestamp must be a valid unix timestamp ($_after_timestamp given)");

        }

        $cron = preg_split("/[\s]+/i",trim($_cron_string));

        $start = empty($_after_timestamp)?time():$_after_timestamp;
        $date = array( 'minutes' =>self::_parseCronNumbers($cron[0],0,59),

                            'hours' =>self::_parseCronNumbers($cron[1],0,23),

                            'dom' =>self::_parseCronNumbers($cron[2],1,31),

                            'month' =>self::_parseCronNumbers($cron[3],1,12),

                            'dow' =>self::_parseCronNumbers($cron[4],0,6),

                        );

        // limited to time()+366 - no need to check more than 1year ahead

        for($i=0;$i<=60*60*24*366;$i+=60){

            if( in_array(intval(date('j',$start+$i)),$date['dom']) &&

                in_array(intval(date('n',$start+$i)),$date['month']) &&

                in_array(intval(date('w',$start+$i)),$date['dow']) &&

                in_array(intval(date('G',$start+$i)),$date['hours']) &&

                in_array(intval(date('i',$start+$i)),$date['minutes'])
                ){

                    return $start+$i;

            }

        }

        return null;

    }
    /**

 * get a single cron style notation and parse it into numeric value

 *

 * @param string $s cron string element

 * @param int $min minimum possible value

 * @param int $max maximum possible value

 * @return int parsed number

 */

    protected static function _parseCronNumbers($s,$min,$max)

    {

        $result = array();
        $v = explode(',',$s);

        foreach($v as $vv){

            $vvv = explode('/',$vv);

            $step = empty($vvv[1])?1:$vvv[1];

            $vvvv = explode('-',$vvv[0]);

            $_min = count($vvvv)==2?$vvvv[0]:($vvv[0]=='*'?$min:$vvv[0]);

            $_max = count($vvvv)==2?$vvvv[1]:($vvv[0]=='*'?$max:$vvv[0]);
            for($i=$_min;$i<=$_max;$i+=$step){

                $result[$i]=intval($i);

            }

        }

        ksort($result);

        return $result;

    }

}
PHP 相关文章推荐
FCKeditor的安装(PHP)
Jan 13 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
Jun 07 PHP
PHP跨时区(UTC时间)应用解决方案
Jan 11 PHP
php页面消耗内存过大的处理办法
Mar 18 PHP
基于empty函数的判断详解
Jun 17 PHP
PHP中判断变量为空的几种方法小结
Nov 12 PHP
php实现的Timer页面运行时间监测类
Sep 24 PHP
php将图片保存入mysql数据库失败的解决方法
Dec 27 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP封装函数实现生成随机的字符串验证码
Jan 24 PHP
PHP文件系统管理(实例讲解)
Sep 19 PHP
PHP获取类私有属性的3种方法
Sep 10 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 #PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 #PHP
CentOS 安装 PHP5.5+Redis+XDebug+Nginx+MySQL全纪录
Mar 25 #PHP
MacOS 安装 PHP的图片裁剪扩展Tclip
Mar 25 #PHP
php编写的一个E-mail验证类
Mar 25 #PHP
php取得字符串首字母的方法
Mar 25 #PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 #PHP
You might like
php对二维数组进行排序的简单实例
2013/12/19 PHP
php提取身份证号码中的生日日期以及验证是否为成年人的函数
2015/09/29 PHP
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
javascript 折半查找字符在数组中的位置(有序列表)
2010/12/09 Javascript
Jquery动态添加及删除页面节点元素示例代码
2014/06/16 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
js实现匹配时换色的输入提示特效代码
2015/08/17 Javascript
jquery性能优化高级技巧
2015/08/24 Javascript
AngularJS使用指令增强标准表单元素功能
2016/07/01 Javascript
详解webpack打包vue时提取css
2017/05/26 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
vue.extend与vue.component的区别和联系
2018/09/19 Javascript
前端Electron新手入门教程详解
2019/06/21 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
Python爬虫实例爬取网站搞笑段子
2017/11/08 Python
神经网络理论基础及Python实现详解
2017/12/15 Python
python Django 创建应用过程图示详解
2019/07/29 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
django form和field具体方法和属性说明
2020/07/09 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
python实现马丁策略的实例详解
2021/01/15 Python
美国最大的高尔夫发球时间预订网站:TeeOff.com
2018/03/28 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
J2EE中的容器都包括哪些
2013/08/21 面试题
质检员的岗位职责
2013/11/15 职场文书
审计专业自荐信范文
2014/04/21 职场文书
经销商年会策划方案
2014/05/29 职场文书
协会周年庆活动方案
2014/08/26 职场文书
网络工程专业大学生求职信
2014/10/01 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
汽车销售合同文本
2019/08/08 职场文书