<?php
// +----------------------------------------------------------------------+
// | virtualCron 0.1 |
// +----------------------------------------------------------------------+
// | Date: 6 Mar 2007 |
// +----------------------------------------------------------------------+
// | License: LGPL |
// +----------------------------------------------------------------------+
// | virtualCron is a PHP class, that simulates a cron job, |
// | in order to execute scripts periodically |
// | without a real crontab command. |
// +----------------------------------------------------------------------+
// | Author: Giorgos Tsiledakis <gt(at)corissia(dot)com> |
// +----------------------------------------------------------------------+
//==============================================================================================
// To simulate a cron job, we need an absolute time value to estimate the time required to perform some task.
// This class uses the generation or last modification time of a control file on the server to achieve that.
//
// Advantage: no need of crontab commands or solutions like php preprocessing
// Disadvantage: a user access is required to perform some task
//
// Example:
// $vcron=new virtualcron(10,"virtualcron.txt"); // "10" minutes after the last modification of "virtualcron.txt"
// if ($vcron->allowAction()) print "Hello World"; // some action will be allowed
//
// Within the delay period nothing will happen -> allowAction=false
// if the delay period has passed the first user, who runs the script, with activate some action -> allowAction=true.
// All other users will be again within the delay period and nothing will happen.
// That's all
// Use this e.g. to parse RSS Feeds every 30 minutes, to generate your google sitemap once a week etc.
// Of course, prefer a real cron job if your provider allows you to use one
//==============================================================================================
class virtualcron{
var $controlFile="virtualcron.txt"; // the default url of the control file
var $minDelay="1"; // the default delay period in minutes
//==============================================================================================
// PUBLIC [Constructor]
// param $minDelay: sets the delay period in minutes (optional)
// param $conrolFile: sets the control file url (optional). The generation or last modification time
// of this file is used to estimate the time required to be passed, in order to allow an action.
// If there is no control file the function will try to generate one.
//==============================================================================================
function virtualcron($minDelay=false,$controlFile=false){
if ($minDelay) $this->minDelay=$minDelay;
if ($controlFile) $this->controlFile=$controlFile;
$this->lastExec=0; // it will contain the UNIXTIME of the last action
$this->nextExec=0; // it will contain the UNIXTIME of the next action
$this->secToExec=0; // it will contain the time in seconds until of the next action
if (file_exists($this->controlFile)) $this->check=true;
else{
$handle=fopen($this->controlFile, "w");
if (!$handle) $this->check=false;
else{
if (!fwrite($handle,time())) $this->check=false;
else{
fclose($handle);
$this->check=true;
}
}
}
}
//==============================================================================================
// PUBLIC allowAction() [boolean]
// checks if the current execution time is within the delay period. Example:
// $vcron=new virtualcron();
// if ($vcron->allowAction()) ...do something...
// That's all
//==============================================================================================
function allowAction(){
$now=time();
if ($this->check) $FT=$this->getFileCreationTime($this->controlFile);
if ($FT){
$nextExec=$FT+($this->minDelay*60)-$now;
if ($nextExec<0){
$handle=fopen($this->controlFile, "w");
if (!$handle) return false;
else{
if (!fwrite($handle,$now)) return false;
else{
fclose($handle);
$this->lastExec=$now;
$this->nextExec=$now+($this->minDelay*60);
$this->secToExec=$this->minDelay*60;
return true;
}
}
}
else {
$this->lastExec=$FT;
$this->nextExec=$FT+$nextExec;
$this->secToExec=$nextExec;
return false;
}
}
else return false;
}
//==============================================================================================
// PRIVATE getFileCreationTime()
// estimates the generation or last modification time of the control file (UNIXTIME)
//==============================================================================================
function getFileCreationTime($filename){
if (function_exists("filemtime")){
$FT=filemtime($filename);
}
else{
$FT=false;
}
return $FT;
}
}
?>
|