PHP in einem Cronejob

Bash, Shell, PHP, Python, Perl, CGI
bmp
Posts: 116
Joined: 2003-03-13 16:30

PHP in einem Cronejob

Post by bmp »

Hallo,

ich möchte per Cronejob alle 30 minuten ein PHP Script abarbeiten.

Nur leider erhalte ich dort nur folgende ausgabe :

Code: Select all

Content-type: text/html
X-Powered-By: PHP/4.3.1

# exec_cron.cgi
# Execute an existing cron job, and display the output

require './cron-lib.pl';
&ReadParse();

@jobs = &list_cron_jobs();
$job = $jobs[$in{'idx'}];
&can_edit_user(%access, $job->{'user'}) || &error($text{'exec_ecannot'});
&foreign_require("proc", "proc-lib.pl");

# split command into command and input
$job->{'command'} =~ s/\%/\0/g;
@lines = split(/%/ , $job->{'command'});
foreach (@lines) { s/\0/%/g; }
for($i=1; $i<@lines; $i++) {
	$input .= $lines[$i]."n";
	}

$| = 1;
$theme_no_table++;
&header($text{'exec_title'}, "");
print "<hr>n";
&additional_log('exec', undef, $lines[0]);
&webmin_log("exec", "cron", $job->{'user'}, $job);

# Remove variables that wouldn't be in the 'real' cron
foreach $e ('SERVER_PORT', 'GATEWAY_INTERFACE', 'WEBMIN_VAR', 'SERVER_ROOT',
	    'REMOTE_USER', 'SERVER_ADMIN', 'REQUEST_METHOD', 'REMOTE_HOST',
	    'REMOTE_ADDR', 'SERVER_SOFTWARE', 'PATH_TRANSLATED', 'QUERY_STRING',
	    'MINISERV_CONFIG', 'SERVER_NAME', 'SERVER_PROTOCOL', 'REQUEST_URI',
	    'DOCUMENT_ROOT', 'WEBMIN_CONFIG', 'SESSION_ID', 'PATH_INFO',
	    'BASE_REMOTE_USER') {
	delete($ENV{$e});
	}
foreach $e (keys %ENV) {
	delete($ENV{$e}) if ($e =~ /^HTTP_/);
	}

# Set cron environment variables
foreach $e (&read_envs($job->{'user'})) {
	$ENV{$1} = $2 if ($e =~ /^(S+)s+(.*)$/);
	}

# Get command and switch uid/gid
@uinfo = getpwnam($job->{'user'});
$ENV{"HOME"} = $uinfo[7];
$ENV{"SHELL"} = "/bin/sh";
$ENV{"LOGNAME"} = $ENV{"USER"} = $job->{'user'};
$( = $uinfo[3];
$) = "$uinfo[3] $uinfo[3]";
($>, $<) = ($uinfo[2], $uinfo[2]);

# Execute cron command and display output..
print &text('exec_cmd', "<tt>$lines[0]</tt>"),"<p>n";
print "<pre>";
$got = &foreign_call("proc", "safe_process_exec",
		     $lines[0], 0, 0, STDOUT, $input, 1);
print "<i>$text{'exec_none'}</i>n" if (!$got);
print "</pre>n";

print "<hr>n";
&footer("edit_cron.cgi?idx=$in{'idx'}", $text{'edit_return'},
	"", $text{'index_return'});
Führe ich das Script direkt in der Console aus, funktioniert alles richtig.
Das Script füllt mir eine mySQL Datenbank mit daten aus Logfiles.

Weiß einer warum es auf der Console klappt und als Cronejob nicht ?
bobby
Posts: 146
Joined: 2003-08-03 13:42

Re: PHP in einem Cronejob

Post by bobby »

Hallo!

Wieso ein PHP-Script mit der Endung cgi?
Ist das was du da machst den PHP? Ich denke es handelt sich eher um Perl.
Bist du dir sicher, dass du das mit PHP machen willst?

Es gibt da andere Sprachen um soetwas auf der Konsole bzw. als cron-job zu machen (bash-script...).

Und wenn ich das Script so richtig deute, machst du doch nichts anderes als andere Cron-Jobs auszuführen?

Nehmen wir mal an, das Script ist in Perl geschrieben, dann dürften die ersten Zeilen nicht:

Code: Select all

Content-type: text/html 
X-Powered-By: PHP/4.3.1 
heißen, sondern die erste Zeile müsste dann:

Code: Select all

#!/usr/bin/perl -w
heißen.

Du kannst mir auch das Script mal schicken, dann kann ich mir das Problem mal genauer ansehen.

Gruß

B.
bmp
Posts: 116
Joined: 2003-03-13 16:30

Re: PHP in einem Cronejob

Post by bmp »

So hier mal das ganze XMLLOG.php File :

Code: Select all

#!/usr/bin/php
<?php

// Include the mainfunctions and parameters
	include "functions.php";
	ini_set("memory_limit", "32M");
	if(!isset($_GET["filename"]) and $strMode=="auto"):
		$handle=@opendir($strDir) or die("Log-Directory does not exist. Check your settings in functions.php"); 
		while ($strFileName = readdir ($handle)) { 
		    if ($strFileName != "." && $strFileName != ".." and substr($strFileName, -3)=="xml"):
				$strQuery = "SELECT * FROM bf_filesprocessed WHERE filename = '$strFileName'";
				$objDB->do_query($strQuery);
				if(!$objDB->result):
					createLog();
	    		endif; 
			endif;
			}
		closedir($handle); 
	elseif(isset($_GET["filename"])):
		$strFileName = $_GET["filename"];
		createLog();
	elseif($strMode == "manual" and !isset($_GET["filename"])):		
		$handle=@opendir($strDir) or die("Log-Directory does not exist. Check your settings in functions.php"); 
		while ($strFileName = readdir ($handle)) { 
		    if ($strFileName != "." && $strFileName != ".." and substr($strFileName, -3)=="xml"):
				$strQuery = "SELECT * FROM bf_filesprocessed WHERE filename = '$strFileName'";
				$objDB->do_query($strQuery);
				if(!$objDB->result):
					$arrFile[] = $strFileName;
	    		endif; 
			endif;
			}
		closedir($handle); 
		echo "<form method='get'>";
		echo "<select name="filename">";
		while(list($key, $value)=each($arrFile)) {
			echo "<option value="$value">$value</option>";
		}
		echo "</select>";
		echo "<input type="submit" name="run" value="run">";
		echo "</form>";		
	endif;

?>
bobby
Posts: 146
Joined: 2003-08-03 13:42

Re: PHP in einem Cronejob

Post by bobby »

Wie hängen die Scripts denn jetzt zusammen?

das erste Script ist ein Perl-Script, gehe ich mal von aus, und das zweite ist definitiv ja ein php-Script.

Also hast du folgendes vor:
Du willst Daten aus Logfiles in eine MySQL_Datenbank schreiben und das regelmäßig, soweit so gut.

Mit den Code-Snippets kann ich bis jetzt nichts anfangen.
Kannst du mir das Script vielleicht als ganzes zumailen? Ich geb dir meine Mailadresse dann per PM.

Gruß

B.
bmp
Posts: 116
Joined: 2003-03-13 16:30

Re: PHP in einem Cronejob

Post by bmp »

Bobby wrote:Wie hängen die Scripts denn jetzt zusammen?

das erste Script ist ein Perl-Script, gehe ich mal von aus, und das zweite ist definitiv ja ein php-Script.

Also hast du folgendes vor:
Du willst Daten aus Logfiles in eine MySQL_Datenbank schreiben und das regelmäßig, soweit so gut.

Mit den Code-Snippets kann ich bis jetzt nichts anfangen.
Kannst du mir das Script vielleicht als ganzes zumailen? Ich geb dir meine Mailadresse dann per PM.

Gruß

B.
Brauchst du nicht.
Hier mal ein Link zum Downloaden http://www.pbo-clan.ch/dl/phpbfstats.zip
Es ist ein Script um eine Statistik über ein Battlefield Server aufzubauen.
( zu sehen unter http://www.eis-list.de/bfstat/phpbfstats/index.php )
Das ganze läuft normalerweise so ab :

Der Battlefieldserver schreibt ein XML Log.
Dieses XML Log wird per Crone in das Statistik Verzeichniss gesichert und dann entsprechend mit Chown und Chmod ausgestattet.
Nun kommt die Datei xmllog.php ins Spiel. Diese Verarbeitet das XML und schreibt die passenden Einträge in eine mySQL Datenbank ab.
(Normalerweise per aufruf im Browser)
bobby
Posts: 146
Joined: 2003-08-03 13:42

Re: PHP in einem Cronejob

Post by bobby »

Ah, jetzt verstehe ich das ganze erst richtig.

Die erste Zeile des Scripts für die Kommandozeile/Cron sollte #!/usr/bin/php -q sein, ist ja auch.

Du musst die Parameter auf der Kommandozeile/beim Cron-Aufruf übergeben. Also in Cron das Script genau so wie auf der Kommandozeile aufrufen.

Gruß

Björn
bmp
Posts: 116
Joined: 2003-03-13 16:30

Re: PHP in einem Cronejob

Post by bmp »

Bobby wrote:Ah, jetzt verstehe ich das ganze erst richtig.

Die erste Zeile des Scripts für die Kommandozeile/Cron sollte #!/usr/bin/php -q sein, ist ja auch.

Du musst die Parameter auf der Kommandozeile/beim Cron-Aufruf übergeben. Also in Cron das Script genau so wie auf der Kommandozeile aufrufen.

Gruß

Björn
HMMMM,

ich habe mir für das Copy Chmod usw. eine Datei gebastelt.
Führe ich diese auf der Shell auf, klappt es.
Führe ich diese auf per Crone auf klappt es nicht.