PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Cronjob kann nicht PHP mit xml_parser_create



spamcam
30.03.05, 13:49
Hallo zusammen,

ich habe ein PHP-Script geschrieben, welches eine bzw. mehrere XML-Files ausliest und die Daten in eine MySQL-DB wegschreibt. Das funktioniert per Browser-Aufruf einwandfrei.

Jetzt wollte ich mein Script per Cronjob regelmäßig abarbeiten lassen.
Das funktioniert auch bis zu dem Punkt, wo der Parser erzeugt wird:
$xml_parser = xml_parser_create('');

Dort stoppt das Script ohne Fehlermeldung oder Hinweis.......... Verzweiflung!

Warum funktioniert das Script per Browseraufruf und per Cron nicht? Gibt es da Unterschiede, die ich nicht beachtet habe? Kenne mich mit Crons noch nicht so gut aus.
Hatte schon einmal jemand einen Cronjob der mittels PHP ein XML-File parst oder xml_parser_create () verwendet und mir ein Beispiel schicken oder hier posten kann?
Muß man dem Cron erst sagen das er den XML-Parser benötigt, so wie ich ihm erst den Pfad auf PHP zeigen muß (Macht für mich zwar keinen Sinn, weil das ja ein Bestandteil von PHP ist)?

Kann es mit der PHP-Installation zusammenhängen?

Hier noch ein wenig Code zur Verdeutlichung:

Cronaufruf /usr/local/psa/admin/bin/php /home/httpd/vhosts/meinedomain.de/httpdocs/import/import.php

Auszug aus dem PHP-Script:


// XML-Parsen
$file = "/home/httpd/vhosts/meinedomain.de/httpdocs/uploaded_test/".$filename;
echo $file."<br>";
if (file_exists($file)){
echo "Datei ist da jetzt sollte geparst werden!<br>";
// XML_PARSER
$elements = $stack = array();
$count = $depth = 0;

class element{
var $name = '';
var $attributes = array();
var $data = '';
var $depth = 0;
}

function start_element_handler($parser, $name, $attribs){
global $elements, $stack, $count, $depth;

$id = $count;
$element = new element;
$elements[$id] = $element;

$elements[$id]->name = $name;

while(list($key, $value) = each($attribs))
$elements[$id]->attributes[$key] = $value;

$elements[$id]->depth = $depth;

array_push($stack, $id);

$count++;
$depth++;
}

function end_element_handler($parser, $name){
global $stack, $depth;

array_pop($stack);

$depth--;
}

function character_data_handler($parser, $data){
global $elements, $stack;

$elements[$stack[count($stack)-1]]->data .= $data;
}
$xml_parser = xml_parser_create();

marce
30.03.05, 13:57
was passiert, wenn Du das Script an der Console direkt aufrufst?

spamcam
30.03.05, 14:05
was passiert, wenn Du das Script an der Console direkt aufrufst?

Er arbeitet das Script bis $xml_parser = xml_parser_create(); ab und gibt die Textausgabe des Scripts (diverse echos) zurück.

Durch das Einfügen eines echo vor und nachdem $xml_parser = xml_parser_create(); konnte ich dann feststellen wo das Script aufhört.

Fehlermeldung kommt keine :( !

marce
30.03.05, 14:08
ist das genau das, was Du erwartest?

(verstehe Deinen Kommentar nicht so 100%...)

spamcam
30.03.05, 14:23
ist das genau das, was Du erwartest? Auf keinen Fall

(verstehe Deinen Kommentar nicht so 100%...)
Ok, dann versuche ich es nochmal etwas verständlicher ;)

Ich habe eine XML Datei die ich mittels PHP parse und in MySQL importiere.
Das funktioniert per Browser-Aufruf ohne Probleme.

Nun soll stündlich das Script starten um neue XML-Daten zu importieren.

Wenn ich es aber per Cron oder Shell aufrufe arbeitet das Script nur bis zur dieser Stelle:

$xml_parser = xml_parser_create();
Das sollte nartürlich nicht passieren. Andere Aufgaben im Script werden abgearbeitet z.B. file_exists oder MySQL-Abfragen.

spamcam
31.03.05, 14:25
Keiner einen Ansatz?

sirmoloch
31.03.05, 14:29
Du benutzt vielleicht Debian? Schau in /etc/php4/cli/php.ini nach, ob die XML-Erweiterung geladen ist. Ich vermute das Gegenteil. Wo die Konfiguration für den Command Line Parser bei anderen Distributionen liegt weiß ich nicht.

spamcam
31.03.05, 16:28
Nein kein Debian, sondern SUSE 9.1.

Aber wenn ich das Script im Browser starte funktioniert es, und das ist doch die gleiche PHP.ini wie beim Cron oder Shell-Aufruf, oder?

sirmoloch
31.03.05, 16:46
Du siehst doch selbst, dass es anscheinend nicht die selbe Datei ist...

spamcam
31.03.05, 18:01
Mmmmh wenn ich die Seite in der Shell so aufrufe:
/usr/local/psa/admin/bin/php /home/httpd/vhosts/meinedomain.de/httpdocs/import/import.php

Dann müßte die php.ini doch dort auch sein?

Wie stelle ich den fest ob die XML-Erweiterung geladen ist?

Tomek
31.03.05, 18:41
Mit der Funktion phpinfo(). Siehe dazu das PHP-Handbuch: http://de.php.net/manual/de/function.phpinfo.php

spamcam
31.03.05, 20:04
Mit der Funktion phpinfo(). Siehe dazu das PHP-Handbuch: http://de.php.net/manual/de/function.phpinfo.phpVielen Dank Tomek, aber so weit ich sirmoloch verstehe gibt es für die Shell eine eigene php.ini? Dann muß ich die nur noch finden.....
'/etc/php.ini' wäre es laut phpinfo über Browser-Aufruf, aber wie bekomme ich den Pfad für die andere raus? Ich habe nach 'Linux Command Line Parser php.ini ' gegoogelt aber finde nichts.
Oder habe ich es immer noch nicht geschnallt mit der ini? Bin echt kein Linux-Guru, sorry wenn ich da blöde Fragen stelle :ugly: !
Das ganze ist ein 1&1 Root Server mit SUSE 9.1 und Plesk.

@Tomek:
Und wie bereits weiter oben erklärt funktioniert es im Browser und dort ist xml mit phpinfo() geladen. Weil damit habe ich angefangen bevor ich versucht habe die xml-Datei zu verarbeiten :) !