Cron Design: Cron Script Part 3

From The Uniform Server Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

MPG UniCenter

MPG UniCenter

Uniform Server Portable Cron Design

Uniform Servers portable Cron script is shown below.

It includes a logging function and user period translation these are added to a Unix timestamp to produce a new start time reference.

Final Script

<?php
/*
###############################################################################
# Name: run_cron.php
# Developed By: The Uniform Server Development Team
###############################################################################
*/
#error_reporting(0);  // Disable PHP errors and warnings
                      // Comment to Enable for testing

chdir(dirname(__FILE__)); // Change wd to this files location
include_once "../main/includes/config.inc.php";
include_once "../main/includes/functions.php";

//== Variables
$logging   = true;           // true = Enable logging false = disable logging
$log_file  = "cron_log.txt"; // log file name (Can include a reative path)  
$file      = "cron.ini";     // name of configuration (Can add a reative path)
$cron_time = 60;             // Set cron time (tick) in seconds. Default 1 Min
$loop      = $cron_time;     // Set equal allows immediate first time run

if($logging){
  cron_log("### Log Started ========================="); 
}

//== Main loop
while(TRUE){                       // Infinite loop.
 if(get_cron_tracker() != "run"){  // Check every second for user cron stop
   break;                          // reqest. Breaks out of while loop and 
 }                                 // kills script.
 else{
   if($loop == $cron_time){        // True for first entry hence immediately
                                   // runs scriptss. There after run at
                                   // cron time.

//#############################################################################
//#                         Scan Ini File                                     #
//#############################################################################

$ini_array = parse_ini_file($file, true);        // Read cron.ini into array
foreach($ini_array as $key => $value){           // Scan array's main keys

 $tim = strtotime("now");                        //current time
 $tim_s  = strtotime($ini_array[$key]['start']); // Get start time
 $period = $ini_array[$key]['period'];           // Get period
 $path   = $ini_array[$key]['path'];             // Get path to run script
 $ref    = $ini_array[$key]['ref'];              // Get repeat time marker

if((float)$tim > (float)$tim_s){      // New start or started
  if( $ref != ""){                    // It was started
    if( (float)$tim < (float)$ref ){  // Is it a triggered update 
      continue;                       // No: Start next foreach
    }
  }
  //== Eiter a new start or triggered update hence run script

 if($period == "hourly"){              // ... Get user defined period
  $offset =(60*60);                    // Set number of corresponding
 }                                     // seconds ...
 if($period == "daily"){
  $offset =(24*60*60);
 }
 if($period == "weekly"){
  $offset =(7*24*60*60);
 }
 if($period == "monthly"){
  $offset =(4*7*24*60*60);
 }
 if(preg_match('/^\d+/',$period)){     // If is digits 
   $offset = (int)$period;             // Set to int
 }

 $ref = $tim +  $offset;               // Create new repeat time marker
 my_ini_set($file,$key,'ref',$ref);    // Save to ini file for later use 

 // There are two file types that can be run browser or local CLI example:
 // http://localhost/drupal/cron.php
 // ..\..\plugins\dtdns_updater\dtdns_updater.php
 // A user specifies only the path/filename

 if(preg_match('/^http/',$path)){      // Is it a browser address 
   $dummy = @file($path);              // Yes: Run on Server, $dummy not used 
    if($logging){
      cron_log($path);                 // Save to log and add time 
    }
 }
 else{                                 // No: Hence run local PHP script
   $cmd = 'start uniserv.exe '. "\"..\..\usr\local\php\php.exe $path\"";
   pclose(popen($cmd,'r'));            // Start detatched process 
    if($logging){
      cron_log($path);                 // Save to log and add time 
    }
 }
}//if
}// End foreach

//#############################################################################
//#                           END Scan Ini File                               #
//#############################################################################

     //print_r($dummy);      // Test line displays cron page output 
     $loop =0;               // Reset loop counter
   }
   $loop = $loop+1;          // Increment loop counter
  }
  sleep(1);                  // Base delay one second allows stop to be checked 
}

if($logging){
  cron_log("### Log Ended ===========================\n"); 
}

//=== Log =====================================================================
// Logs Cron actions to a log file
// Input: String to be logged
// $file        Path to file including file name

function cron_log($str){
  global $log_file;          // path and name to log file

  $str = date('Y-m-d H:i')."  ".$str."\n";

  $fh = fopen($log_file, 'a') or die("can't open file");
  fwrite($fh, $str);
  fclose($fh);
 
}
//=== END Log =================================================================

?>

Top

Summary

The above script is provided as an example and subject to change if you require the latest version extract it from a new version of Uniform Server V5-Nano series.

File: UniServer\unicon\main\run_cron.php

Top