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 相关文章推荐
How do I change MySQL timezone?
Mar 26 PHP
php下用cookie统计用户访问网页次数的代码
May 09 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
Jun 04 PHP
PHP文件读写操作之文件读取方法详解
Jan 13 PHP
对象失去焦点时自己动提交数据的实现代码
Nov 06 PHP
PHP 下载文件时自动添加bom头的方法实例
Jan 10 PHP
检查用户名是否已在mysql中存在的php写法
Jan 20 PHP
php获取错误信息的方法
Jul 17 PHP
高质量PHP代码的50个实用技巧必备(下)
Jan 22 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP实现腾讯与百度坐标转换
Aug 05 PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 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
转生史莱姆:萌王第一次撸串开心到飞起,哥布塔撸串却神似界王神
2018/11/30 日漫
织梦模板标记简介
2007/03/11 PHP
两个强悍的php 图像处理类1
2009/06/15 PHP
PHP 上传文件大小限制
2009/07/05 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
php通过各种函数判断0和空
2020/07/04 PHP
Laravel核心解读之异常处理的实践过程
2019/02/24 PHP
jquery select操作的日期联动实现代码
2009/12/06 Javascript
Node.js异步I/O学习笔记
2014/11/04 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
详解在不使用ssr的情况下解决Vue单页面SEO问题
2018/11/08 Javascript
vue+node实现图片上传及预览的示例方法
2018/11/22 Javascript
JS实现马赛克图片效果完整示例
2019/04/13 Javascript
layer父页获取弹出层输入框里面的值方法
2019/09/02 Javascript
js单线程的本质 Event Loop解析
2019/10/29 Javascript
前端开发之便利店收银系统代码
2019/12/27 Javascript
Python生成8位随机字符串的方法分析
2017/12/05 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
Python跳出多重循环的方法示例
2019/07/03 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
如何清空python的变量
2020/07/05 Python
python三引号如何输入
2020/07/06 Python
HTML5 表单验证失败的提示语问题
2017/07/13 HTML / CSS
英国骑行、跑步、游泳、铁人三项运动装备专卖店:Wiggle
2016/08/23 全球购物
美国网上花店:JustFlowers
2017/02/12 全球购物
程序集与命名空间有什么不同
2014/07/25 面试题
大学学生个人总结
2015/02/15 职场文书
公司借条范本
2015/05/25 职场文书
新党员入党决心书
2015/09/22 职场文书
python字符串的多行输出的实例详解
2021/06/08 Python
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android