Login   Register  
PHP Classes
elePHPant
Icontem

File: example.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Mick Sear  >  PHP Cron  >  example.php  >  Download  
File: example.php
Role: Example script
Content type: text/plain
Description: Example of use
Class: PHP Cron
Parse cron schedules to find when cron job ran
Author: By
Last change:
Date: 2005-07-07 05:20
Size: 4,250 bytes
 

Contents

Class file image Download
<?php
/*
 * This file illustrates how PHP Cron might be used.  It constitutes a check in
 * a database (MySQL sql source included below), and logs if the application
 * runs.  Here's an application overview:
 * 
 * Purpose:  To provide failover support for cron jobs on a secondary server
 * Requirements:  Cron, Database, command-line PHP support.  Non-PHP apps can be
 * wrapped in a PHP program that will exit or run and log as appropriate.
 * Your crontab needs the hostname set as an environment variable so PHP can
 * pick up on it.  Put the following at the top of your crontab:
 *  HOSTNAME="hostA"
 * 
 * SQL consists of two tables:  One to define the cron jobs that are being
 * monitored, a second to log events.  Here is the SQL:
 * 
 * CREATE TABLE projects (
  id int(10) NOT NULL default '0',
  name varchar(200) NOT NULL default '',
  notes text,
  cron_schedule varchar(30) NOT NULL default ''
) TYPE=MyISAM;

CREATE TABLE monitor (
  id int(10) default '0',
  project_id int(3) NOT NULL default '0',
  event_date datetime NOT NULL default '0000-00-00 00:00:00',
  event_type varchar(50) NOT NULL default '',
  hostname varchar(20) default NULL,
  notes text
) TYPE=MyISAM;

 * I leave it to the reader to implement a front-end to add and show monitoring
 * information for projects.
 * 
 */
 
 
include("CronParser.php");
 
 
//The project id needs to match the id of the project you enter into the projects table
$project_id 1;  
    
 
//If the host is the failover host, we check if the cron ran on the primary    
 
if (didCronRun($project_id"hostA") && $_ENV['HOSTNAME'] == "hostB"){
     
$debug_msg .= "$project cron ran on ".$_ENV['HOSTNAME']." !!!\n";
     
//Since the cron ran on the main host, we can exit the script.
     
exit;    
 } else {
     
$debug_msg .= "Hostname is set to ".$_ENV['HOSTNAME'];
     
//OK, the job didn't run on the primary host.  Log the fact that this cron is running:
     
@db_log($project_id"CRON"$_ENV['HOSTNAME']." starting my cron job");
     
//Now continue to run your cron application.  If you're running a perl/shell script, you can just exec it
     //Otherwise, you'll probably want to just set the $project_id in your
     //code and include this file.  
 


 
 
/**
 * Utility function to determine if the cron job (id) ran normally for a
 * given host.
 */
function didCronRun($id$host){
    
    
//Implement your own db connection here.
    
$db db();
    
    
//Get the schedule of the cron from the database (e.g. "0 5 * * *")
    
$q "select cron_schedule from projects where id='".$id."'";
    
$cron_schedule mysql_result(mysql_query($q$db),0,0);
    
    
//Start new cron parser instance        
    
$cron = new CronParser($cron_schedule);
    
$lastRan $cron->getLastRan(); //Array (0=minute, 1=hour, 2=dayOfMonth, 3=month, 4=week, 5=year)     
    
    //Convert to Unix timestamp
    
$cron_ran mktime $lastRan[1] ,$lastRan[0],$lastRan[3] ,$lastRan[2], $lastRan[5]); 
    
    
//Now, we look for a log entry for this app's cron job running OK
    //We're looking for a time within 45 secs or so of the $cron_ran time.  
    //You may want to adjust this if your job takes a while to run...         
    
$q "SELECT * FROM `monitor` WHERE event_date > from_unixtime(".($cron_ran-45).") " .
            
" and event_type = 'CRON' " .
            
" and project_id='".$id."' " .
            
" order by event_date desc ";
            
    
$r = @mysql_query($q$db);
    
$row = @mysql_fetch_array($r);
    
    
//Return either true or false depending on whether the job has run OK since given time.
    
if (isset($row['hostname']) && $row['hostname'] == $host){
        
//Job ran on the specified host
        
return true 
    } else {
        
//Job didn't run on the specified host, so it needs to run on failover host.
        
return false;
    }         
}  

 
/**
  * Log application cron event in the database
  */
 
function db_log($id$type$notes){
    
$logConn db(); //Implement your own connection here
    
$q "insert into monitor values ('', '".$id."', now(), '".$type."', '".$_ENV['HOSTNAME']."',  '".$notes."')";
    
    
$r = @mysql_query($q$logConn);            
    
    if (@
mysql_affected_rows()< 1){
        
//Query seems to have failed.  Email it instead:
        
mail ("your email""Log failed ($type) for app id $id"$notes"");            
    }
 }

?>