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初学者头痛的十四个问题
Jul 12 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
May 05 PHP
PHP CodeBase:将时间显示为&quot;刚刚&quot;&quot;n分钟/小时前&quot;的方法详解
Jun 06 PHP
163的邮件用phpmailer发送(实例详解)
Jun 24 PHP
跟我学Laravel之安装Laravel
Oct 15 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php实现登录tplink WR882N获取IP和重启的方法
Jul 20 PHP
PHP实现大数(浮点数)取余的方法
Feb 18 PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 PHP
PHP操作MongoDB实现增删改查功能【附php7操作MongoDB方法】
Apr 24 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
php微信开发之音乐回复功能
Jun 14 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 SQLite类
2009/05/07 PHP
js实现遮罩层划出效果是生成div而不是显示
2014/07/29 Javascript
深入理解javascript原型链和继承
2014/09/23 Javascript
深入解读JavaScript中的Iterator和for-of循环
2015/07/28 Javascript
JS简单获取及显示当前时间的方法
2016/08/03 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
jQuery表单插件ajaxForm实例详解
2017/01/17 Javascript
将angular.js项目整合到.net mvc中的方法详解
2017/06/29 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
解决jQuery使用append添加的元素事件无效的问题
2018/08/30 jQuery
详解TypeScript+Vue 插件 vue-class-component的使用总结
2019/02/18 Javascript
uni-app微信小程序登录并使用vuex存储登录状态的思路详解
2019/11/04 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
python fabric实现远程部署
2017/01/05 Python
python cx_Oracle模块的安装和使用详细介绍
2017/02/13 Python
python安装教程 Pycharm安装详细教程
2017/05/02 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
详解Django定时任务模块设计与实践
2019/07/24 Python
python sorted方法和列表使用解析
2019/11/18 Python
pytorch数据预处理错误的解决
2020/02/20 Python
TensorFlow2.X结合OpenCV 实现手势识别功能
2020/04/08 Python
Python基于pandas爬取网页表格数据
2020/05/11 Python
python实现代码审查自动回复消息
2021/02/01 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
《桃花心木》教学反思
2014/02/17 职场文书
函授生自我鉴定
2014/03/25 职场文书
公司领导班子对照检查材料
2014/09/24 职场文书
2014年学生资助工作总结
2014/12/18 职场文书
新的CSS 伪类函数 :is() 和 :where()示例详解
2022/08/05 HTML / CSS