front_content.php?debug=1

Gesperrt
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

front_content.php?debug=1

Beitrag von emergence »

@timo

ähm, bin mir nicht sicher ob das so beabsichtig ist dass pseudo-cron-inc.php (v1.2.1) die debug info rauswirft....
das sollte ja nur der fall sein wenn ich in pseudo-cron-inc.php debug=true setze...
emergence
Beiträge: 10653
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence »

ich hab das jetzt geändert + noch ne kleinigkeit...

der aufruf für den cronjob in der front_content.php und in news.php sieht jetzt nur mehr so aus:

Code: Alles auswählen

/* Include cronjob-Emulator */
cInclude("includes", "pseudo-cron.inc.php");
den teil mit changedir und wieder zurücksetzen habe ich dort komplett rausgeworfen...
(weil es logischer ist das, dass in der pseudo-cron.inc.php datei gemacht werden kann)

jetzt der ersatz für die includes/pseudo-cron.inc.php (ersetzt sie komplett)

Code: Alles auswählen

<?php
/***************************************************************************

pseudo-cron v1.2.1.con // modified version for contenido
(c) 2003 Kai Blankenhorn
www.bitfolge.de/en
kaib@bitfolge.de

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

****************************************************************************


Usually regular tasks like backup up the site's database are run using cron
jobs. With cron jobs, you can exactly plan when a certain command is to be
executed. But most homepage owners can't create cron jobs on their web
server - providers demand some extra money for that.
The only thing that's certain to happen quite regularly on a web page are
page requests. This is where pseudo-cron comes into play: With every page
request it checks if any cron jobs should have been run since the previous
request. If there are, they are run and logged.

Pseudo-cron uses a syntax very much like the Unix cron's one. For an
overview of the syntax used, see a page of the UNIXGEEKS. The syntax
pseudo-cron uses is different from the one described on that page in
the following points:

  -  there is no user column
  -  the executed command has to be an include()able file (which may contain further PHP code)


All job definitions are made in a text file on the server with a
user-definable name. A valid command line in this file is, for example:

*	2	1,15	*	*	samplejob.inc.php

This runs samplejob.inc.php at 2am on the 1st and 15th of each month.


Features:
  -  runs any PHP script
  -  periodical or time-controlled script execution
  -  logs all executed jobs
  -  can be run from an IMG tag in an HTML page
  -  follow Unix cron syntax for crontabs


Usage:
  -  Modify the variables in the config section below to match your server.
  -  Write a PHP script that does the job you want to be run regularly. Be
     sure that any paths in it are relative to the script that will run
     pseudo-cron in the end.
  -  Set up your crontab file with your script
  -  Wait for the next scheduled run :)


Note:
You can log messages to pseudo-cron's log file by calling
     logMessage("log a message", $PC_writeDir, $PC_useLog, $PC_debug);


Changelog:

v1.2.1.con	11-28-03
	changed: removed all global variables
	changed: renamed intern variables
	changed: intern function calls
	changed: extended debug information
	modified by horwath@opensa.org

v1.2.1	02-03-03
	fixed:	 jobs may be run too often under certain conditions
	added:	 global debug switch
	changed: typo in imagecron.php which prevented it from working


v1.2	01-31-03
	added:   more documentation
	changed: log file should now be easier to use
	changed: log file name


v1.1	01-29-03
	changed: renamed pseudo-cron.php to pseudo-cron.inc.php
	fixed:   comments at the end of a line don't work
	fixed:   empty lines in crontab file create nonsense jobs
	changed: log file grows big very quickly
	changed: included config file in main file to avoid directory confusion
	added:   day of week abbreviations may now be used (three letters, english)


v1.0	01-17-03
	inital release

***************************************************************************/


/****************************************/
/*		config section					*/
/****************************************/

// || PLEASE NOTE:
// || all paths used here and in cron scripts
// || must be absolute or relative to the script which includes pseudo-cron.inc.php!

// the file that contains the job descriptions
// for a description of the format, see http://www.unixgeeks.org/security/newbie/unix/cron-1.html
// and http://www.bitfolge.de/pseudocron
$PC_cronTab = $cfg["path"]["contenido"].$cfg['path']['cronjobs']."crontab.txt";

// the directory where the script can store information on completed jobs and its log file
// include trailing slash
$PC_writeDir = $cfg["path"]["contenido"].$cfg['path']['cronjobs'];

// the directory where the script can store information on completed jobs and its log file
// include trailing slash
$PC_jobDir = $cfg["path"]["contenido"].$cfg['path']['cronjobs'];

// store directory information
$PC_reqDir = getcwd();

// control logging, 1=use log file, 0=don't use log file
$PC_useLog = 1;

// turn on / off debugging output
// DO NOT use this on live servers!
$PC_debug = false;

/****************************************/
/*		don't change anything here		*/
/****************************************/

define("PC_MINUTE",	1);
define("PC_HOUR",	2);
define("PC_DOM",	3);
define("PC_MONTH",	4);
define("PC_DOW",	5);
define("PC_CMD",	7);
define("PC_CRONLINE", 8);

if ($PC_debug) {
	echo "<pre>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";
}
chdir($PC_jobDir);
$PC_jobs = parseCronFile($PC_cronTab, $PC_debug);
for ($i=0;$i<count($PC_jobs);$i++) {
	runJob($PC_jobs[$i], $PC_jobDir, $PC_writeDir, $PC_useLog, $PC_debug);
}
chdir($PC_reqDir);
if ($PC_debug) echo "\n</pre>";

function logMessage($msg, $PC_writeDir, $PC_useLog, $PC_debug) {

	if ($PC_useLog==1) {
		$logfile = $PC_writeDir."pseudo-cron.log";
		$file = fopen($logfile,"a");
		if ($msg[strlen($msg)-1]!="\n") {
			$msg.="\r\n";
		}
		if ($PC_debug) echo $msg;
		fputs($file,date("r",time())."  ".$msg);
		fclose($file);
	}
}

function lTrimZeros($number) {

	while ($number[0]=='0') {
		$number = substr($number,1);
	}
	return $number;
}

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 ($matches[4]=="") {
				$matches[4] = $matches[2];
			}
			if ($matches[5][0]!="/") {
				$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,"r");
		$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);
	$file = fopen($jobfile,"w");
	fputs($file,$lastRun);
	fclose($file);
}

function runJob($job, $PC_jobDir, $PC_writeDir, $PC_useLog, $PC_debug=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);

	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 {
			@include($PC_jobDir.$job[PC_CMD]);		// any error messages are supressed
		}
		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();
	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;
}

?>
änderungen:
die konfigurations einstellungen in der pseudo-cron.inc.php datei funktionieren jetzt so wie sie sollen... --> könnte man jetzt auch in die includes/config.php verlegen
alle global definitionen in der datei sind rausgeflogen
alle variablen haben jetzt den prefix PC_ erhalten...
ein aufrufen der debug infos via front_content.php?debug=1 oder wie jetzt umbenannt ?PC_debug=1 ist nicht mehr möglich...
die debug anzeige wurde ebenfalls modifiziert, so das sie funktioniert und die konfiguration von pseudo-cron.php.inc mit anzeigt...

ich hab das jetzt ne zeitlang getestet und es funktioniert perfekt...

was nicht gemacht wurde:
den funktionen ebenfalls diesen prefix zu verpassen (was aber keine schlechte idee wäre)
die variablen mittels unset wieder zu killen...
vielleicht später mal

ach ja diese änderungen sollten ab contenido 4.4.0 funktionieren...
timo
Beiträge: 6284
Registriert: Do 15. Mai 2003, 18:32
Wohnort: Da findet ihr mich nie!
Kontaktdaten:

Beitrag von timo »

Ich hab's gerade eingebaut :)
Gesperrt