Location: PHPKode > projects > PhpBMS > phpbms/modules/base/cron.php
<?php

	$loginNoKick=true;
	$loginNoDisplayError=true;

 	include("../../include/session.php");
	/**
	  *  tables.php for push records 
	  */
	include_once("../../include/tables.php");


	//testing cron access
	if(isset($_GET["t"]) && !APP_DEBUG){

		echo "ztz";
		exit;

	}//endif

	$now = gmdate('Y-m-d H:i', strtotime('now'));

	$querystatement = "
		SELECT
			`scheduler`.id,
			`scheduler`.name,
			`scheduler`.crontab,
			IF(`scheduler`.`pushrecordid` != '', 'pushrecord', 'job') AS `type`,
			`scheduler`.job,
			`scheduler`.`pushrecordid`,
			`scheduler`.startdatetime,
			`scheduler`.enddatetime
			";
		
	if(moduleExists("mod:b2d42220-443b-fe74-dbdb-ed2c0968c38c", $phpbms->modules)){
		$querystatement .= "
			,
			`tabledefs`.`maintable`,
			`modules`.`name` AS `modulename`
		FROM
		";
		$querystatement .= "
			(((scheduler LEFT JOIN `pushrecords` ON `scheduler`.`pushrecordid` = `pushrecords`.`uuid`) LEFT JOIN `tabledefs` ON `pushrecords`.`originuuid` = `tabledefs`.`uuid`) LEFT JOIN `modules` ON `tabledefs`.`moduleid` = `modules`.`uuid`)
		";
	}else{
		$querystatement .= "
		FROM
		";
		$querystatement .= "
			`scheduler`
		";
	}//end if
	
	$querystatement .= " WHERE
			`scheduler`.inactive = '0'
			AND `scheduler`.startdatetime < NOW()
			AND (`scheduler`.enddatetime > NOW() OR `scheduler`.enddatetime IS NULL)
	";

	$queryresult=$db->query($querystatement);

	while($schedule_record=$db->fetchArray($queryresult)){

		$datetimearray=explode(" ",$schedule_record["startdatetime"]);
		$schedule_record["startdate"]=stringToDate($datetimearray[0],"SQL");
		$schedule_record["starttime"]=stringToTime($datetimearray[1],"24 Hour");

		if($schedule_record["enddatetime"]){

			$datetimearray=explode(" ",$schedule_record["enddatetime"]);
			$schedule_record["enddate"]=stringToDate($datetimearray[0],"SQL");
			$schedule_record["endtime"]=stringToTime($datetimearray[1],"24 Hour");

		}//endif enddateiem

		$validTimes = getTimes($schedule_record);

		if(is_array($validTimes) && in_array($now, $validTimes)){

			switch($schedule_record["type"]){

				case "job":
					$success = @ include($schedule_record["job"]);
					break;

				case "pushrecord":
					include_once("../../modules/api/include/push.php");
				
					//try to include table specific functions
					$tableFile = "../../modules/".$schedule_record["modulename"]."/include/".$schedule_record["maintable"].".php";
					
					if(file_exists($tableFile))
						include_once($tableFile);
					
					$push = new push($db, $schedule_record["pushrecordid"]);
					$success = $push->process();
					break;
				
			}//end switch

			if($success){

				$updatestatement = "UPDATE scheduler SET lastrun=NOW() WHERE id=".$schedule_record["id"];
				$db->query($updatestatement);
				$log = new phpbmsLog("Scheduled Job ".$schedule_record["name"]." (".$schedule_record["id"].") completed","SCHEDULER","usr:42e0cc76-3c31-d9b6-ff12-fe4adfd15e75");

			} else {

				$log = new phpbmsLog("Scheduled Job ".$schedule_record["name"]." (".$schedule_record["id"].") returned errors","SCHEDULER","usr:42e0cc76-3c31-d9b6-ff12-fe4adfd15e75");

			}//endif success

		}//endif is_array();

	}//endwhile


	function getTimes($recordarray){

		$dayInt = array('*',1,2,3,4,5,6,7);
		$dayLabel = array('*',"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
		$monthsInt = array(0,1,2,3,4,5,6,7,8,9,10,11,12);
		$monthsLabel = array(0,"January","February","March","April","May","June","July","August","September","October","November","December");
		$metricsVar = array("*", "/", "-", ",");
		$metricsVal = array(' every ','',' thru ',' and ');

		$dateTimes = array();
		$ints	= explode('::', str_replace(' ','',$recordarray["crontab"]));
		$days	= $ints[4];
		$mons	= $ints[3];
		$dates	= $ints[2];
		$hrs	= $ints[1];
		$mins	= $ints[0];
		$today	= getdate(gmmktime());

		// derive day part
		if($days == '*') {
			//do nothing
		} elseif(strstr($days, '*/')) {
			$theDay = str_replace('*/','',$days);
			$dayName[] = str_replace($dayInt, $dayLabel, $theDay);
		} elseif($days != '*') {
			if(strstr($days, ',')) {
				$exDays = explode(',',$days);
				foreach($exDays as $k1 => $dayGroup) {
					if(strstr($dayGroup,'-')) {
						$exDayGroup = explode('-', $dayGroup);
						for($i=$exDayGroup[0];$i<=$exDayGroup[1];$i++) {
							$dayName[] = str_replace($dayInt, $dayLabel, $i);
						}
					} else { // individuals
						$dayName[] = str_replace($dayInt, $dayLabel, $dayGroup);
					}
				}
			} elseif(strstr($days, '-')) {
				$exDayGroup = explode('-', $days);
				for($i=$exDayGroup[0];$i<=$exDayGroup[1];$i++) {
					$dayName[] = str_replace($dayInt, $dayLabel, $i);
				}
			} else {
				$dayName[] = str_replace($dayInt, $dayLabel, $days);
			}

			// check the day to be in scope:
			if(!in_array($today['weekday'], $dayName)) {
				return false;
			}
		} else {
			return false;
		}


		// derive months part
		if($mons == '*') {
			// do nothing
		} elseif(strstr($mons, '*/')) {
			$mult = str_replace('*/','',$mons);
			$startMon = date(strtotime('m',$recordarray["startdate"]));
			$startFrom = ($startMon % $mult);

			for($i=$startFrom;$i<=12;$i+$mult) {
				$compMons[] = $i+$mult;
				$i += $mult;
			}
			// this month is not in one of the multiplier months
			if(!in_array($today['mon'],$compMons)) {
				return false;
			}
		} elseif($mons != '*') {
			if(strstr($mons,',')) { // we have particular (groups) of months
				$exMons = explode(',',$mons);
				foreach($exMons as $k1 => $monGroup) {
					if(strstr($monGroup, '-')) { // we have a range of months
						$exMonGroup = explode('-',$monGroup);
						for($i=$exMonGroup[0];$i<=$exMonGroup[1];$i++) {
							$monName[] = $i;
						}
					} else {
						$monName[] = $monGroup;
					}
				}
			} elseif(strstr($mons, '-')) {
				$exMonGroup = explode('-', $mons);
				for($i=$exMonGroup[0];$i<=$exMonGroup[1];$i++) {
					$monName[] = $i;
				}
			} else { // one particular month
				$monName[] = $mons;
			}

			// check that particular months are in scope
			if(!in_array($today['mon'], $monName)) {
				return false;
			}
		}


		// derive dates part
		if($dates == '*') {
			//do nothing
		} elseif(strstr($dates, '*/')) {
			$mult = str_replace('*/','',$dates);
			$startDate = date('d', strtotime($recordarray["startdate"]));
			$startFrom = ($startDate % $mult);

			for($i=$startFrom; $i<=31; $i+$mult) {
				$dateName[] = str_pad(($i+$mult),2,'0',STR_PAD_LEFT);
				$i += $mult;
			}

			if(!in_array($today['mday'], $dateName)) {
				return false;
			}
		} elseif($dates != '*') {
			if(strstr($dates, ',')) {
				$exDates = explode(',', $dates);
				foreach($exDates as $k1 => $dateGroup) {
					if(strstr($dateGroup, '-')) {
						$exDateGroup = explode('-', $dateGroup);
						for($i=$exDateGroup[0];$i<=$exDateGroup[1];$i++) {
							$dateName[] = $i;
						}
					} else {
						$dateName[] = $dateGroup;
					}
				}
			} elseif(strstr($dates, '-')) {
				$exDateGroup = explode('-', $dates);
				for($i=$exDateGroup[0];$i<=$exDateGroup[1];$i++) {
					$dateName[] = $i;
				}
			} else {
				$dateName[] = $dates;
			}

			// check that dates are in scope
			if(!in_array($today['mday'], $dateName)) {
				return false;
			}
		}

		// derive hours part
		$currentHour = date('G', strtotime('00:00'));
		if($hrs == '*') {
			for($i=0;$i<24; $i++) {
				$hrName[]=$i;
			}
		} elseif(strstr($hrs, '*/')) {
			$mult = str_replace('*/','',$hrs);
			for($i=0; $i<24; $i) { // weird, i know
				$hrName[]=$i;
				$i += $mult;
			}
		} elseif($hrs != '*') {
			if(strstr($hrs, ',')) {
				$exHrs = explode(',',$hrs);
				foreach($exHrs as $k1 => $hrGroup) {
					if(strstr($hrGroup, '-')) {
						$exHrGroup = explode('-', $hrGroup);
						for($i=$exHrGroup[0];$i<=$exHrGroup[1];$i++) {
							$hrName[] = $i;
						}
					} else {
						$hrName[] = $hrGroup;
					}
				}
			} elseif(strstr($hrs, '-')) {
				$exHrs = explode('-', $hrs);
				for($i=$exHrs[0];$i<=$exHrs[1];$i++) {
					$hrName[] = $i;
				}
			} else {
				$hrName[] = $hrs;
			}
		}

		// derive minutes
		$currentMin = date('i', strtotime($recordarray["starttime"]));
		if(substr($currentMin, 0, 1) == '0') {
			$currentMin = substr($currentMin, 1, 1);
		}
		if($mins == '*') {
			for($i=0; $i<60; $i++) {
				if(($currentMin + $i) > 59) {
					$minName[] = ($i + $currentMin - 60);
				} else {
					$minName[] = ($i+$currentMin);
				}
			}
		} elseif(strstr($mins,'*/')) {
			$mult = str_replace('*/','',$mins);
			$startMin = date('i',strtotime($recordarray["starttime"]));
			$startFrom = ($startMin % $mult);
			for($i=$startFrom; $i<=59; $i) {
				if(($currentMin + $i) > 59) {
					$minName[] = ($i + $currentMin - 60);
				} else {
					$minName[] = ($i+$currentMin);
				}
				$i += $mult;
			}

		} elseif($mins != '*') {
			if(strstr($mins, ',')) {
				$exMins = explode(',',$mins);
				foreach($exMins as $k1 => $minGroup) {
					if(strstr($minGroup, '-')) {
						$exMinGroup = explode('-', $minGroup);
						for($i=$exMinGroup[0]; $i<=$exMinGroup[1]; $i++) {
							$minName[] = $i;
						}
					} else {
						$minName[] = $minGroup;
					}
				}
			} elseif(strstr($mins, '-')) {
				$exMinGroup = explode('-', $mins);
				for($i=$exMinGroup[0]; $i<=$exMinGroup[1]; $i++) {
					$minName[] = $i;
				}
			} else {
				$minName[] = $mins;
			}
		}

		// prep some boundaries - these are not in GMT b/c gmt is a 24hour period, possibly bridging 2 local days
		$timeFromTs = 0;
		$timeToTs = strtotime('+1 da');
		$timeToTs++;
		$lastRunTs = 0;




		/**
		 * initialize return array
		 */
		$validJobTime = array();

		$hourSeen = 0;
		foreach($hrName as $kHr=>$hr) {
			$hourSeen++;
			foreach($minName as $kMin=>$min) {
				if($hr < $currentHour || $hourSeen == 25)
					$theDate = date('Y-m-d', strtotime('+1 day'));
				else
					$theDate = date('Y-m-d');

				$tsGmt = strtotime($theDate.' '.str_pad($hr,2,'0',STR_PAD_LEFT).":".str_pad($min,2,'0',STR_PAD_LEFT).":00"); // this is LOCAL
				$validJobTime[] = gmdate('Y-m-d H:i', $tsGmt);
			}
		}
		sort($validJobTime);

		return $validJobTime;
	}//end function
?>
Return current item: PhpBMS