PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl/Oracle: Crash wegen vielen Hashes?



bionic
27-01-2006, 15:41
Hi miteinander,

ich habe ein Problem an dem ich mir die Zähne ausbeisse. Ich habe die Funktion schon viele male umgeschrieben, aber leider ohne das gewünschte Ergebnis.
Ich habe in einer Oracle 9i Datenbank eine table mit mehreren Einträgen. Die Datenbank hat 360 Zeilen, die meisten sind NULL.

Aufgabe der Funktion:
Die Funktion soll alle Datensätze mit der gewünschten ID auslesen. Das sind 1 bis n Einträge.

Danach soll sie die Einträge miteinander vergleichen. Ist ein Wert überall identisch, wird dieser Wert in einen Hash geschrieben. Gibt es irgendwo eine Abweichung, d.h. mindestens ein Datensatz ist anders als die anderen, soll "item_locked" in den Hash für diese Kategorie geschrieben werden.

Nun, meine Funktion funktioniert soweit ganz gut, wenn ein Datensatz ausgewählt ist. Sie schafft auch mehrere, aber ab und zu (Ich vermute, wenn zu viele Abweichungen auftauchen) bei so ca. 5-10 (unterschiedlich von Mal zu Mal!) crashed mir das Skript. Die Fehlermeldung im Browser ist ein HTTP 500, ein interner Serverfehler.

Der Errorlog meint folgendes:

[DATUM] failure (18704): for host MEINE_IP trying to GET /cgi-bin/dev/debug.pl, cgi_scan_headers reports: the CGI program cgi-bin/dev/debug.pl did not produce a valid header (too many headers from CGI script (max 200))

Ein Headererror weist ja auf einen fehlenden Header hin. Das ist allerdings nicht das Problem, es wird ein korrekter Header geschrieben. (sonst funktionierts ja auch)

Ich vermute, dass irgendwo in meiner Funktion jeweils ein Header geschrieben wird. Ich habe leider keine Ahnung, wo das passiert.

Hat jemand einen heissen Tipp?

Vielen Dank für eure Hilfe!

bionic



sub get_datasets {
my $dbh = shift;
my $tabletemp = shift;
my $id = shift;

my @results;
my %temp;
my %hash;

my $sql="SELECT * FROM $tabletemp WHERE ID='$id'";

my $sth = $dbh->prepare($sql) or die $dbh->errstr();
$sth->execute or die $dbh->errstr();
while (my $hash_ref = $sth->fetchrow_hashref) {
push(@results,$hash_ref);
}

$sth->finish ();

foreach (@results){
%temp = %{$_};
foreach (keys(%temp)){
if (!defined $hash{$_}){
$hash{$_} = $temp{$_};
}
elsif ($hash{$_} ne $temp{$_}){
$hash{$_} = "item_locked";
}
}
%temp = ();
}

return %hash;
}

Molaf
28-01-2006, 07:56
Hallo,

das mit den fehlenden Headern kann vorkommen, wenn das Skript bereits eine Ausgabe auf STOUT schreibt, bevor die Header und die fertige Seite zurückgeliefert werden, beispielsweise eine Fehlermeldung. oder ähnliches.

Ruf das ganze doch einfach mehrfach über ein Programm auf, mit:

my @test=qx('/opt/lampp/cgi-bin/skript.cgi');

Wenn $test[0] nicht den Header enthält, vielmehr nicht immer, dann hast Du einen weiteren Ansatzpunkt zur Fehlersuche.

Romanday
30-01-2006, 12:04
Der Errorlog meint folgendes:

[DATUM] failure (18704): for host MEINE_IP trying to GET /cgi-bin/dev/debug.pl, cgi_scan_headers reports: the CGI program cgi-bin/dev/debug.pl did not produce a valid header (too many headers from CGI script (max 200))

Ein Headererror weist ja auf einen fehlenden Header hin. Das ist allerdings nicht das Problem, es wird ein korrekter Header geschrieben. (sonst funktionierts ja auch)

Ich vermute, dass irgendwo in meiner Funktion jeweils ein Header geschrieben wird. Ich habe leider keine Ahnung, wo das passiert.

Hat jemand einen heissen Tipp?


did not produce a valid header (too many headers from CGI script (max 200))

Da fehlt kein Header, sondern der hat zu viele Zeilen.
Du solltest mal nachschauen, wer die sonst noch Header Zeilen reinjumbelt,
und die gegebenenfals unterdrücken.