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 相关文章推荐
初学CAKEPHP 基础教程
Nov 02 PHP
用php实现的获取网页中的图片并保存到本地的代码
Jan 05 PHP
php 数组使用详解 推荐
Jun 02 PHP
PHP中几个常用的魔术常量
Feb 23 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
Jun 05 PHP
探讨php中header的用法详解
Jun 07 PHP
PHP使用DOMDocument类生成HTML实例(包含常见标签元素)
Jun 25 PHP
PHP获取youku视频真实flv文件地址的方法
Dec 23 PHP
详解php比较操作符的安全问题
Dec 03 PHP
我整理的PHP 7.0主要新特性
Jan 07 PHP
PHP如何使用Memcached
Apr 05 PHP
PHP fopen函数用法实例讲解
Feb 15 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利用MySQL保存session的实现思路及示例代码
2014/09/09 PHP
php字符集转换
2017/01/23 PHP
PHP简单实现遍历目录下特定文件的方法小结
2017/05/22 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
广告显示判断
2006/08/31 Javascript
javascript事件模型代码
2007/07/01 Javascript
ext 代码生成器
2009/08/07 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
jQuery表格插件datatables用法总结
2014/09/05 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
使用Chrome浏览器调试AngularJS应用的方法
2015/06/18 Javascript
详解JavaScript的Polymer框架中的通知交互
2015/07/29 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
JavaScript字符串对象
2017/01/14 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
vue使用mint-ui实现下拉刷新和无限滚动的示例代码
2017/11/06 Javascript
详解Node.js一行命令上传本地文件到服务器
2019/04/22 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
前端插件之Bootstrap Dual Listbox使用教程
2019/07/23 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
python替换字符串中的子串图文步骤
2019/06/19 Python
Python定时任务随机时间执行的实现方法
2019/08/14 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
python文件及目录操作代码汇总
2020/07/08 Python
Ramy Brook官网:美国现代女装品牌
2019/06/18 全球购物
什么是抽象
2015/12/13 面试题
夏季奶茶店创业计划书
2014/01/16 职场文书
理工大学毕业生自荐信范文
2014/02/22 职场文书
工程采购员岗位职责
2014/03/09 职场文书
关于环保的建议书400字
2014/03/12 职场文书
英文自荐信常用句子
2014/03/26 职场文书
亲戚关系证明
2015/06/24 职场文书