Inwiefern (und warum) können Skripte "spinnen"...
Patrick
- perl
0 Björn Höhrmann0 Calocybe0 Patrick
Hallo Cracks!
Innerhalb kurzer Zeit haben zwei von mir auf Atomic Eggs bzw. SELFSPEZIAL eingesetzte Perlskripte total "bescheurte" Ergebnisse geliefert.
Ich hoffe, dass es mir gelingt, die Sache einigermaßen verständlich zu beschreiben:
Das erste Skript, das hin und wieder "spinnt" dürfte den meisten hier bekannt sein. Das ist das, eher gesagt, einer der zwei Skripte, die für die SELF-Visitenkarten zuständig sind.
Dort kann man ja nebst der URL der eigenen Homepage noch bis zu 2 URLs von Projekten angeben, an welchen man mitgewirkt hat. Die Variablen sind einfach benannt:
$project1_url und $project2_url
Nun ist es bereits zwei mal geschehen, dass diese bei der Ausgabe "durcheinandergewürfelt" wurden. Und zwar kam das dabei raus:
Projekt 1 wurde korrekt verlinkt:
<a class="bluefogb" href="URL\_VON\_PROJEKT\_1"><b>URL\_VON\_PROJEKT\_1</b></a>
Aber bei Projekt 2 kam das raus (bitte genau schauen):
<a class="bluefogb" href="URL\_VON\_PROJEKT\_1"><b>URL\_VON\_PROJEKT\_2</b></a>
Also, der Verweistext wurde richtig gesetzt, der Verweis an sich (im <a>-Tag war jedoch falsch)
Die entsprechende Visitenkarten habe ich händisch nachgebessert. Die print-Befehle sehen so aus:
<a class=\"bluefogb\" href=\"$project1\_url\"><b>$project1\_url</b></a>
<a class=\"bluefogb\" href=\"$project1\_url\"><b>$project1\_url</b></a>
was ja bei 149 von derzeit 151 Visis richtig funktionierte.
Das zweite Skript, das heute zum ersten Mal "gesponnen" hat, ist eine Abwandlung des SELFSPEZIAL Gästebuchs: Die Atomic Eggs Fehlermeldungsseite. Dort kann der User zunächst seine eigene Fehlermeldung uploaden, bekommt dann eine Bestätigungsseite, die das Formular enthält, mit welchem der Einreicher seine Errorbox selber kommentieren kann. Anschauungsbeispiel: http://www.atomic-eggs.com/cgi-bin/fehler.cgi?view
Heute war auf einmal, anstelle des vom User geposteten Textes unterhalb der Meldungsgrafik, ein Textarea zu sehen, welcher HTML-Code aus anderen Bereichen des Skripts enthielt, unter anderem aus der Subroutine, die mir eine Mail nach jedem Einreichen einer Fehlermeldung sendet. Bei einem anschliessenden Testupload und -kommentar von mir war aber alles in Ordnung, genau so wie bei den 56 zuvor hochgeladenen Meldungen auch!
Was verursacht solche fehlerhafte Ausgaben? "Spinnt" das Skript an sich, oder spinnt der Server? Ist es die Folge eines kurzzeitigen Ausfalls? Wie kann man dem vorbeugen?
Im voraus für Antworten dankend
Bis danndann
PAF (patrickausfrankfurt)
<img src="/selfaktuell/extras/selfcomm.jpg" alt=""> http://www.atomic-eggs.com/selfspezial/guests/advguest.cgi?view
<img src="http://www.atomic-eggs.com/selfspezial/atomicegg.gif" id="ei0" alt="Atomic Eggs - die humosophische Seite" onMouseUp="window.location.href='http://www.atomic-eggs.com/'" onmouseover="if(document.all)document.all.ei0.style.cursor='hand';status='http://www.atomic-eggs.com/';return true;" onmouseout="status='';return true;">
[...]
#!perl -w
use strict;
danach sicherstellen, dass du entweder nicht mod_perl benutzt oder deine Scripts gut genug sind, dass sie mit mod_perl keinen Ärger machen können.
Hi Patrick!
Etwas Source-Code wuerde uns sicher helfen, Fehler in den Scripts zu finden, solltest Du eigentlich wissen. Vorher aber hilft Dir Bjoen's Tip vielleicht schon, einige Fehler selber zu finden.
Die entsprechende Visitenkarten habe ich händisch nachgebessert. Die print-Befehle sehen so aus:
»» <a class="bluefogb" href="$project1_url"><b>$project1_url</b></a>
»» <a class="bluefogb" href="$project1_url"><b>$project1_url</b></a>
Das sind erstens keine print-Befehle, zweitens hast Du zweimal dieselbe Zeile reingepastet. Ich nehme an, das sieht im Script nicht so aus?
So long
Hallo Calo!
Etwas Source-Code wuerde uns sicher helfen, Fehler in den Scripts zu finden, solltest Du eigentlich wissen.
Sicher, da ich aber nicht weiß, wo der (vermeintliche) Fehler sein könnte, die Skripts schon recht lange sind, wollte ich dem Forum das ersparen...
»» <a class="bluefogb" href="$project1_url"><b>$project1_url</b></a>
»» <a class="bluefogb" href="$project1_url"><b>$project1_url</b></a>Das sind erstens keine print-Befehle, zweitens hast Du zweimal dieselbe Zeile reingepastet. Ich nehme an, das sieht im Script nicht so aus?
Das print "...\n" habe ich natürlich nicht mit gepostet, sicher fängt die Zeile mit print " an und endet mit \n"; ;-)
Die zweite Zeile soll natürlich heissen:
<a class="bluefogb" href="$project2_url"><b>$project2_url</b></a>
Vorher aber hilft Dir Bjoen's Tip vielleicht schon, einige Fehler selber zu finden.
Ich kenne mich use strict; leider überhaupt nicht aus. Ich lese auch desöfteren, dass man cgi.pm anstatt einer form-parse-sub wie in den Matt Wright Scripts benutzen sollte, jedoch sagt mir das (noch) absolut nicht. Kommt Zeit, habe ich auch das im Griff... aber erstmal Zeit haben, ne?
Bis danndann
PAF (patrickausfrankfurt)
<img src="/selfaktuell/extras/selfcomm.jpg" alt=""> http://www.atomic-eggs.com/selfspezial/guests/advguest.cgi?view
<img src="http://www.atomic-eggs.com/selfspezial/atomicegg.gif" id="ei1" alt="Atomic Eggs - die humosophische Seite" onMouseUp="window.location.href='http://www.atomic-eggs.com/'" onmouseover="if(document.all)document.all.ei1.style.cursor='hand';status='http://www.atomic-eggs.com/';return true;" onmouseout="status='';return true;">
Hallo PAF (patrickausfrankfurt)
Ich kenne mich use strict; leider überhaupt nicht aus. Ich lese auch desöfteren, dass man cgi.pm anstatt einer form-parse-sub wie in den Matt Wright Scripts benutzen sollte, jedoch sagt mir das (noch) absolut nicht. Kommt Zeit, habe ich auch das im Griff... aber erstmal Zeit haben, ne?
'use strict' sorgt dafür, daß Du nur Variablen verwenden kannst, welche auch deklariert sind, so ähnlich wie es z.B. in C notwendig ist.
Das erfolgt mit
my($skalar,@Array,%Hash);
Das ist insbesonders wichtig, falls Du mod_perl am Server alufen hast. Dort ist es nämlich so, daß das Script eigentlich nie wirklich beendet wird, solange der Server läuft. Jeder Subserver von Apache hat zwar seine eigene Kopie des Scripts laufen, aber beendet werden die i.d.R. nur, wenn der Apache beendet wird.
Wenn aber globale Variablen verwendet werden, wie dies der Fall ist, wenn Du nicht 'my' verwendest, dann passiert es, daß Du bei einem zweiten 'Aufruf' des Scripts mit alten Werten, noch dazu mit dennen eines anderen Subserver, arbeitest. Das kann recht witzige, aber normalerweise doch nervige Effekte zur Folge haben.
So 'nebenbei' hat die Verwendung von 'my' und 'use strict' auch zur Folge, daß Du recht schnell auf Schreibfehler bei Variablennamen kommst.
Deshalb der Tip:
Am Anfang jedes Scripts
#!/usr/bin/perl -w
use strict;
Da swar jetzt vielleicht eine etwas 'popularwissenschaftliche', sprich für den Theoretiker ungenaue, Erklärung, aber so im Wesentlichen triffst den Sachverhalt ;-)
Grüße nach Frankfurt
Klaus