当前位置:首页 > PHP教程 > php应用 > 列表

PHP中实现crontab代码分享

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-18 20:26:53 浏览: 评论:0 

这篇文章主要介绍了PHP中实现crontab代码分享,本文给出了实现代码和使用方法,需要的朋友可以参考下。

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 源码:

  1. // 从./crontab读取cron项,也可以从其他持久存储(mysql、redis)读取 
  2. $crontab = file('./crontab'); 
  3. $now = $_SERVER['REQUEST_TIME']; 
  4. foreach ( $crontab as $cron ) { 
  5.  $slices = preg_split("/[\s]+/"$cron, 6); 
  6.  ifcount($slices) !== 6 ) continue
  7.  
  8.  $cmd       = array_pop($slices); 
  9.  $cron_time = implode(' '$slices); 
  10.  $next_time = Crontab::parse($cron_time$now); 
  11.  if ( $next_time !== $now ) continue;  
  12.  
  13.  $pid = pcntl_fork(); 
  14.  if ($pid == -1) { 
  15.   die('could not fork'); 
  16.  } else if ($pid) { 
  17.   // we are the parent 
  18.   pcntl_wait($status, WNOHANG); //Protect against Zombie children 
  19.  } else { 
  20.       // we are the child 
  21.   `$cmd`; 
  22.   exit
  23.  } 
  24.  
  25. /* https://github.com/jkonieczny/PHP-Crontab */ 
  26. class Crontab { 
  27.    /** 
  28.  * Finds next execution time(stamp) parsin crontab syntax, 
  29.  * after given starting timestamp (or current time if ommited) 
  30.  * 
  31.  * @param string $_cron_string: 
  32.  * 
  33.  * 0 1 2 3 4 
  34.  * * * * * * 
  35.  * - - - - - 
  36.  * | | | | | 
  37.  * | | | | +----- day of week (0 - 6) (Sunday=0) 
  38.  * | | | +------- month (1 - 12) 
  39.  * | | +--------- day of month (1 - 31) 
  40.  * | +----------- hour (0 - 23) 
  41.  * +------------- min (0 - 59) 
  42.  * @param int $_after_timestamp timestamp [default=current timestamp] 
  43.  * @return int unix timestamp - next execution time will be greater 
  44.  * than given timestamp (defaults to the current timestamp) 
  45.  * @throws InvalidArgumentException 
  46.  */ 
  47.     public static function parse($_cron_string,$_after_timestamp=null) 
  48.     { 
  49.         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))){ 
  50.             throw new InvalidArgumentException("Invalid cron string: ".$_cron_string); 
  51.         } 
  52.         if($_after_timestamp && !is_numeric($_after_timestamp)){ 
  53.             throw new InvalidArgumentException("\$_after_timestamp must be a valid unix timestamp ($_after_timestamp given)"); 
  54.         } 
  55.         $cron = preg_split("/[\s]+/i",trim($_cron_string)); 
  56.         $start = emptyempty($_after_timestamp)?time():$_after_timestamp
  57.  
  58.         $date = array'minutes' =>self::_parseCronNumbers($cron[0],0,59), 
  59.                             'hours' =>self::_parseCronNumbers($cron[1],0,23), 
  60.                             'dom' =>self::_parseCronNumbers($cron[2],1,31), 
  61.                             'month' =>self::_parseCronNumbers($cron[3],1,12), 
  62.                             'dow' =>self::_parseCronNumbers($cron[4],0,6), 
  63.                         ); 
  64.         // limited to time()+366 - no need to check more than 1year ahead 
  65.         for($i=0;$i<=60*60*24*366;$i+=60){ 
  66.             if( in_array(intval(date('j',$start+$i)),$date['dom']) && 
  67.                 in_array(intval(date('n',$start+$i)),$date['month']) && 
  68.                 in_array(intval(date('w',$start+$i)),$date['dow']) && 
  69.                 in_array(intval(date('G',$start+$i)),$date['hours']) && 
  70.                 in_array(intval(date('i',$start+$i)),$date['minutes']) 
  71.  
  72.                 ){ 
  73.                     return $start+$i
  74.             } 
  75.         } 
  76.         return null; 
  77.     } 
  78.  
  79.     /** 
  80.  * get a single cron style notation and parse it into numeric value 
  81.  * 
  82.  * @param string $s cron string element 
  83.  * @param int $min minimum possible value 
  84.  * @param int $max maximum possible value 
  85.  * @return int parsed number 
  86.  */ 
  87.     protected static function _parseCronNumbers($s,$min,$max
  88.     { 
  89.         $result = array(); 
  90.  
  91.         $v = explode(',',$s); 
  92.         foreach($v as $vv){ 
  93.             $vvv = explode('/',$vv); 
  94.             $step = emptyempty($vvv[1])?1:$vvv[1]; 
  95.             $vvvv = explode('-',$vvv[0]); 
  96.             $_min = count($vvvv)==2?$vvvv[0]:($vvv[0]=='*'?$min:$vvv[0]); 
  97.             $_max = count($vvvv)==2?$vvvv[1]:($vvv[0]=='*'?$max:$vvv[0]); 
  98.  
  99.             for($i=$_min;$i<=$_max;$i+=$step){ 
  100.                 $result[$i]=intval($i); 
  101.             } 
  102.         } 
  103.         ksort($result); 
  104.         return $result
  105.     } 
  106. }

Tags: crontab

分享到: