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 相关文章推荐
PHP新手上路(十三)
Oct 09 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
ThinkPHP模板输出display用法分析
Nov 26 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
Mar 05 PHP
详解WordPress开发中wp_title()函数的用法
Jan 07 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
php Session无效分析资料整理
Nov 29 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 PHP
基于php数组中的索引数组和关联数组详解
Mar 12 PHP
thinkPHP框架整合tcpdf插件操作示例
Aug 07 PHP
PHP模型Model类封装数据库操作示例
Mar 14 PHP
Jsonp劫持学习
Apr 01 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
德生S2000电路分析
2021/03/02 无线电
用PHP和MySQL保存和输出图片
2006/10/09 PHP
php将会员数据导入到ucenter的代码
2010/07/18 PHP
老生常谈PHP面向对象之标识映射
2017/06/21 PHP
JavaScript中的Location地址对象
2008/01/16 Javascript
JS支持带x身份证号码验证函数
2008/08/10 Javascript
IE event.srcElement和FF event.target 功能比较
2010/03/01 Javascript
关于firefox的ElementTraversal 接口 使用说明
2010/11/11 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
javascript-简单的计算器实现步骤分解(附图)
2013/05/30 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
基于vue的下拉刷新指令和滚动刷新指令
2016/12/23 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
利用JQuery操作iframe父页面、子页面的元素和方法汇总
2017/09/10 jQuery
JavaScript刷新页面的几种方法总结
2019/03/28 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
如何在JavaScript中正确处理变量
2020/12/25 Javascript
Python 文件操作实现代码
2009/10/07 Python
Python 基于Twisted框架的文件夹网络传输源码
2016/08/28 Python
基于python代码实现简易滤除数字的方法
2018/07/17 Python
Python实现二维曲线拟合的方法
2018/12/29 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
python实现输入三角形边长自动作图求面积案例
2020/04/12 Python
硕士研究生个人求职信
2013/12/04 职场文书
中专生自我鉴定书范文
2013/12/28 职场文书
优秀共产党员先进事迹
2014/01/27 职场文书
市场营销调查计划书
2014/05/02 职场文书
安全教育演讲稿
2014/05/09 职场文书
诉前财产保全担保书
2014/05/20 职场文书
学校清洁工岗位职责
2015/04/15 职场文书
联谊活动总结范文
2015/05/09 职场文书
SQL 窗口函数实现高效分页查询的案例分析
2021/05/21 SQL Server
Python实现滑雪小游戏
2021/09/25 Python