Configuration:"; echo "\nPC_cronTab = " . $PC_cronTab; echo "\nPC_writeDir = " . $PC_writeDir; echo "\nPC_jobDir = " . $PC_jobDir; echo "\nPC_reqDir = " . $PC_reqDir; echo "\nPC_useLog = " . $PC_useLog; echo "\n"; } global $bJobRunned; $bJobRunned = false; chdir($PC_jobDir); $PC_jobs = parseCronFile($PC_cronTab, $PC_debug); for ($i = 0; $i < count($PC_jobs); $i++) { $bJobRunned = true; runJob($PC_jobs[$i], $PC_jobDir, $PC_writeDir, $PC_useLog, $PC_debug); } $PC_jobs = parseCronFile($PC_localCronTab, $PC_debug); for ($i = 0; $i < count($PC_jobs); $i++) { $bJobRunned = true; runJob($PC_jobs[$i], $PC_jobDir, $PC_writeDir, $PC_useLog, $PC_debug); } chdir($PC_reqDir); if ($PC_debug) echo "\n"; function logMessage($msg, $PC_writeDir, $PC_useLog, $PC_debug) { $oCronLog = new cCronJob(); $oCronLog->useCronLog($PC_useLog); $oCronLog->logMessages($msg); unset($oCronLog); if ($PC_debug) { echo $msg; } } function lTrimZeros($number) { while ($number[0] == '0') { $number = substr($number, 1); } return (is_numeric($number))?$number:0; } function parseElement($element, &$targetArray, $numberOfElements) { $subelements = explode(",", $element); for ($i = 0; $i < $numberOfElements; $i++) { $targetArray[$i] = $subelements[0] == "*"; } for ($i = 0; $i < count($subelements); $i++) { if (preg_match("~^(\\*|([0-9]{1,2})(-([0-9]{1,2}))?)(/([0-9]{1,2}))?$~", $subelements[$i], $matches)) { if ($matches[1] == "*") { $matches[2] = 0; // from $matches[4] = $numberOfElements; //to } elseif (!array_key_exists(4, $matches) || $matches[4] == "") { $matches[4] = $matches[2]; } if (array_key_exists(5, $matches)) { if ($matches[5][0] != "/") { $matches[6] = 1; // step } } else { $matches[6] = 1; // step } for ($j = lTrimZeros($matches[2]); $j <= lTrimZeros($matches[4]); $j += lTrimZeros($matches[6])) { $targetArray[$j] = TRUE; } } } } function decDate(&$dateArr, $amount, $unit, $PC_debug) { if ($PC_debug) echo sprintf("Decreasing from %02d.%02d. %02d:%02d by %d %6s ", $dateArr[mday], $dateArr[mon], $dateArr[hours], $dateArr[minutes], $amount, $unit); if ($unit == "mday") { $dateArr["hours"] = 23; $dateArr["minutes"] = 59; $dateArr["seconds"] = 59; $dateArr["mday"] -= $amount; $dateArr["wday"] -= $amount % 7; if ($dateArr["wday"] < 0) { $dateArr["wday"] += 7; } if ($dateArr["mday"] < 1) { $dateArr["mon"] --; switch ($dateArr["mon"]) { case 0: $dateArr["mon"] = 12; $dateArr["year"] --; // fall through case 1: case 3: case 5: case 7: case 8: case 10: case 12: $dateArr["mday"] = 31; break; case 4: case 6: case 9: case 11: $dateArr["mday"] = 30; break; case 2: $dateArr["mday"] = 28; break; } } } elseif ($unit == "hour") { if ($dateArr["hours"] == 0) { decDate($dateArr, 1, "mday", $PC_debug); } else { $dateArr["minutes"] = 59; $dateArr["seconds"] = 59; $dateArr["hours"] --; } } elseif ($unit == "minute") { if ($dateArr["minutes"] == 0) { decDate($dateArr, 1, "hour", $PC_debug); } else { $dateArr["seconds"] = 59; $dateArr["minutes"] --; } } if ($PC_debug) echo sprintf("to %02d.%02d. %02d:%02d\n", $dateArr[mday], $dateArr[mon], $dateArr[hours], $dateArr[minutes]); } function getLastScheduledRunTime($job, $PC_debug) { $dateArr = getdate(); $minutesBack = 0; while ( $minutesBack < 525600 AND ( !$job[PC_MINUTE][$dateArr["minutes"]] OR ! $job[PC_HOUR][$dateArr["hours"]] OR ( !$job[PC_DOM][$dateArr["mday"]] OR ! $job[PC_DOW][$dateArr["wday"]]) OR ! $job[PC_MONTH][$dateArr["mon"]]) ) { if (!$job[PC_DOM][$dateArr["mday"]] OR ! $job[PC_DOW][$dateArr["wday"]]) { decDate($dateArr, 1, "mday", $PC_debug); $minutesBack += 1440; continue; } if (!$job[PC_HOUR][$dateArr["hours"]]) { decDate($dateArr, 1, "hour", $PC_debug); $minutesBack += 60; continue; } if (!$job[PC_MINUTE][$dateArr["minutes"]]) { decDate($dateArr, 1, "minute", $PC_debug); $minutesBack++; continue; } } if ($PC_debug) print_r($dateArr); return mktime($dateArr["hours"], $dateArr["minutes"], 0, $dateArr["mon"], $dateArr["mday"], $dateArr["year"]); } function getJobFileName($jobname, $PC_writeDir) { $jobfile = $PC_writeDir . urlencode($jobname) . ".job"; return $jobfile; } function getLastActialRunTime($jobname, $PC_writeDir) { $jobfile = getJobFileName($jobname, $PC_writeDir); if (file_exists($jobfile)) { $file = fopen($jobfile, "rb"); $lastRun = fgets($file, 100); fclose($file); if (is_numeric($lastRun)) { return $lastRun; } } return 0; } function markLastRun($jobname, $lastRun, $PC_writeDir) { $jobfile = getJobFileName($jobname, $PC_writeDir); if ($file = @fopen($jobfile, "w")) { fputs($file, $lastRun); fclose($file); } else { //echo "Could not write into file $jobfile - permission denied."; } } function runJob($job, $PC_jobDir, $PC_writeDir, $PC_useLog, $PC_debug = false) { global $cfg, $sess, $PC_logDir; if (!is_writable($PC_writeDir)) { return false; } $extjob = Array(); $jobfile = getJobFileName($job[PC_CMD], $PC_writeDir); parseElement($job[PC_MINUTE], $extjob[PC_MINUTE], 60); parseElement($job[PC_HOUR], $extjob[PC_HOUR], 24); parseElement($job[PC_DOM], $extjob[PC_DOM], 31); parseElement($job[PC_MONTH], $extjob[PC_MONTH], 12); parseElement($job[PC_DOW], $extjob[PC_DOW], 7); $lastActual = getLastActialRunTime($job[PC_CMD], $PC_writeDir); $lastScheduled = getLastScheduledRunTime($extjob, $PC_debug); //echo "LastSch: " . $lastScheduled . " ::: LastAct: " . $lastActual . "\n"; if ($lastScheduled > $lastActual) { logMessage("Running " . $job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); logMessage(" Last run: " . date("r", $lastActual), $PC_writeDir, $PC_useLog, $PC_debug); logMessage(" Last scheduled: " . date("r", $lastScheduled), $PC_writeDir, $PC_useLog, $PC_debug); markLastRun($job[PC_CMD], $lastScheduled, $PC_writeDir); if ($PC_debug) { echo getcwd(); include($PC_jobDir . $job[PC_CMD]); // display errors only when debugging } else { if (is_object($sess)) { $sess->freeze(); } @include($PC_jobDir . $job[PC_CMD]); // any error messages are supressed if (is_object($sess)) { $sess->thaw(); } } logMessage("Completed " . $job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); return true; } else { if ($PC_debug) { logMessage("Skipping " . $job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); logMessage(" Last run: " . date("r", $lastActual), $PC_writeDir, $PC_useLog, $PC_debug); logMessage(" Last scheduled: " . date("r", $lastScheduled), $PC_writeDir, $PC_useLog, $PC_debug); logMessage("Completed " . $job[PC_CRONLINE], $PC_writeDir, $PC_useLog, $PC_debug); } return false; } } function parseCronFile($PC_cronTabFile, $PC_debug) { $file = @file($PC_cronTabFile); $job = Array(); $jobs = Array(); if(!is_countable($file)) { return $jobs; } for ($i = 0; $i < count($file); $i++) { if ($file[$i][0] != '#') { // old regex, without dow abbreviations: // if (preg_match("~^([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-7,/*]+|Sun|Mon|Tue|Wen|Thu|Fri|Sat)\\s+([^#]*)(#.*)?$~i",$file[$i],$job)) { if (preg_match("~^([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-9,/*]+)\\s+([-0-7,/*]+|(-|/|Sun|Mon|Tue|Wed|Thu|Fri|Sat)+)\\s+([^#]*)(#.*)?$~i", $file[$i], $job)) { $jobNumber = count($jobs); $jobs[$jobNumber] = $job; if ($jobs[$jobNumber][PC_DOW][0] != '*' AND ! is_numeric($jobs[$jobNumber][PC_DOW])) { $jobs[$jobNumber][PC_DOW] = str_replace( Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"), Array(0, 1, 2, 3, 4, 5, 6), $jobs[$jobNumber][PC_DOW]); } $jobs[$jobNumber][PC_CMD] = trim($job[PC_CMD]); $jobs[$jobNumber][PC_CRONLINE] = $file[$i]; } } } if ($PC_debug) { var_dump($jobs); } return $jobs; } class cCronJob { protected $_sCronTabFileName = "crontab.txt"; protected $_sCronTabLocalFileName = "crontab.local.txt"; protected $_sLogFileName = "pseudo-cron.log"; protected $_sJobDir; protected $_sCronDir; protected $_sLogDir; private $_bUseLog; private $_iMaxLogFileSize = 1024; public function __construct() { $this->_sJobDir = cRegistry::getConfigValue('path', 'conlite') . cRegistry::getConfigValue('path', 'cronjobs'); $this->_sCronDir = cRegistry::getConfigValue('path', 'conlite_cronlog'); $this->_sLogDir = cRegistry::getConfigValue('path', 'conlite_logs'); } public function runJob() { } public function useCronLog($bUse = TRUE) { $this->_bUseLog = boolval($bUse); } public function logMessages($sMsg) { if (!$this->_bUseLog) { return; } if (is_dir($this->_sLogDir) && is_writable($this->_sLogDir)) { $logfile = $this->_sLogDir . $this->_sLogFileName; } else if (is_dir($this->_sCronDir) && is_writable($this->_sCronDir)) { $logfile = $this->_sCronDir . $this->_sLogFileName; } else { cWarning(__FILE__, __LINE__, "PseudoCron: Cannot write cronlog file!"); return; } if ($sMsg[strlen($sMsg) - 1] != "\n") { $sMsg .= "\r\n"; } $this->_rotateLogFiles($logfile); file_put_contents($logfile, $sMsg, FILE_APPEND); } private function _rotateLogFiles($sLogFile) { if (file_exists($sLogFile) && filesize($sLogFile) >= $this->_iMaxLogFileSize * 1024) { // rotate $path_info = pathinfo($sLogFile); $base_directory = $path_info['dirname']; $base_name = $path_info['basename']; $num_map = array(); foreach (new DirectoryIterator($base_directory) as $fInfo) { if ($fInfo->isDot() || !$fInfo->isFile()) { continue; } if (preg_match('/^' . $base_name . '\.?([0-9]*)$/', $fInfo->getFilename(), $matches)) { $num = $matches[1]; $file2move = $fInfo->getFilename(); if ($num == '') { $num = 0; } $num_map[$num] = $file2move; } } krsort($num_map); foreach ($num_map as $num => $file2move) { $targetN = $num + 1; if($targetN > 10) { unlink($base_directory . DIRECTORY_SEPARATOR . $file2move); continue; } rename($base_directory . DIRECTORY_SEPARATOR . $file2move, $base_directory . DIRECTORY_SEPARATOR .$base_name . '.' . $targetN); } } } } ?>