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&amp;&amp;mysql)二
Oct 09 PHP
PHP Memcached应用实现代码
Feb 08 PHP
PHP 登录记住密码实现思路
May 07 PHP
深入PHP内存相关的功能特性详解
Jun 08 PHP
smarty中js的调用方法示例
Oct 27 PHP
[原创]php逐行读取txt文件写入数组的方法
Jul 02 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
Jun 22 PHP
Yii数据读取与跳转参数传递用法实例分析
Jul 12 PHP
浅谈PHP中类和对象的相关函数
Apr 26 PHP
php封装db类连接sqlite3数据库的方法实例
Dec 19 PHP
PHP大文件切割上传并带进度条功能示例
Jul 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
Protoss魔法科技
2020/03/14 星际争霸
php 删除cookie和浏览器重定向
2009/03/16 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
javascript 闭包疑问
2010/12/30 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
jQuery中:radio选择器用法实例
2015/01/03 Javascript
AngularJS 与百度地图的结合实例
2016/10/20 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
JavaScript实现删除数组重复元素的5种常用高效算法总结
2018/01/18 Javascript
JavaScript反射与依赖注入实例详解
2018/05/29 Javascript
Angular6项目打包优化的实现方法
2019/12/15 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
vue实现折线图 可按时间查询
2020/08/21 Javascript
Python3如何解决字符编码问题详解
2017/04/23 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
图解Python变量与赋值
2018/04/03 Python
使用python进行文本预处理和提取特征的实例
2018/06/05 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
python线程join方法原理解析
2020/02/11 Python
Jupyter Notebook输出矢量图实例
2020/04/14 Python
python中for in的用法详解
2020/04/17 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
python基于exchange函数发送邮件过程详解
2020/11/06 Python
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
会计实习自我鉴定
2013/12/04 职场文书
中文师范生自荐信
2014/01/30 职场文书
作弊检讨书1000字
2014/02/01 职场文书
绘画专业自荐信
2014/07/04 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
考试作弊万能检讨书
2014/10/19 职场文书
教师调动申请报告
2015/05/18 职场文书
导游词之台湾阿里山
2019/10/23 职场文书
企业内部管理控制:采购授权审批制度范本
2020/01/19 职场文书