Counter in Perl.
Daniel
- perl
0 Frank Schönmann0 Cheatah0 Jörk Behrends0 Daniel
Hallo Leute!
weil mein Counter (von Goweb) in letzter Zeit nicht gerade zuverlässig ist, habe ich mich entschlossen, ein Counter in PERL zu schreiben. Soweit so gut. Auf meinem Rechner (Win95) läuft es einwandfrei. Auf meiner Site (Apache unter Unix) läuft es leider nicht. Ich habe auch die nötigen Sachen angepaßt und die Zugriffsrechte auch (ich hab's mit 777 und 755 probiert).
Nachfolgend mein Source-Code. Der Counter wird korrekt angezeigt aber. Aber die Inkrementierung findet nicht statt und in der Protokoll-Datei steht auch nichts :o(
Vielen Dank im voraus
Daniel
PS: Verbesserungsvorschläge sind auch willkommen :o)
#!/usr/bin/perl
$BASEDIR="/usr/www/htdocs/userid"; #natürlich habe ich meine userid hier angegeben *g*
#eine Datei namens count.txt wird geöffnet und eingelesen. Dadrin ist der aktuelle Counterstand #abgespeichert.
@zeilen = ("");
open(COUNT, "<$BASEDIR/ml/count.txt");
while(<COUNT>)
{
push(@zeilen,$_);
}
close(COUNT);
$counter = ++$zeilen[1]; #counter wird inkrementiert
@zeichen = split(//,$zeilen[1]); #Der Counterwert wird gesplittet (Counter besteht aus 4 Ziffern und wird in 4 Teilen geteilt)
#Erzeugung von HTML-Code
$grafik[0] = "<img src=../ml/digits/$zeichen[0].gif>";
$grafik[1] = "<img src=../ml/digits/$zeichen[1].gif>";
$grafik[2] = "<img src=../ml/digits/$zeichen[2].gif>";
$grafik[3] = "<img src=../ml/digits/$zeichen[3].gif>";
#Counter-Datei wird mit dem neuen Wert überschrieben.
open(COUNT2, ">$BASEDIR/ml/count.txt");
print COUNT2 $counter;
close(COUNT2);
#ich will die Zugriffe mitprotokollieren, deshalb Ermittlung der Zeit.
$date=localtime(time);
($day, $month, $num, $time, $year) = split(/\s+/,$date);
#Protokolldatei. Mitprotokolliert werden Besuchernr. - Datum und IP + Host.
open(STAT, ">>$BASEDIR/ml/zugriff.dat");
print STAT "$counter - $num. $month $time - $ENV{'HTTP_USER_AGENT'} - $ENV{'REMOTE_ADDR'} - $ENV{'REMOTE_HOST'}\n";
close(STAT);
#jetzt wird die Datei mit dem Counter erzeugt (sie befindet sich in einem Frame)
print <<__END_OF_TEXT__;
Content-type: text/html
<head>
<link rel=stylesheet type="text/css" href="../ml/style.css">
</head>
<body bgcolor="#ADCDFF">
<center>
<h3>
Sie sind Besucher Nr.:
</h3>
<br>
$grafik[0]$grafik[1]$grafik[2]$grafik[3]
</center>
</body>
__END_OF_TEXT__
hi!
weil mein Counter (von Goweb) in letzter Zeit nicht gerade zuverlässig ist, habe ich mich
entschlossen, ein Counter in PERL zu schreiben. Soweit so gut. Auf meinem Rechner
(Win95) läuft es einwandfrei. Auf meiner Site (Apache unter Unix) läuft es leider nicht. Ich
habe auch die nötigen Sachen angepaßt und die Zugriffsrechte auch (ich hab's mit 777 und
755 probiert).
Warum glaubt jeder, mit 777 würde es funktionieren? Wenn der Server richtig konfiguriert ist, sollte es damit erst recht nicht funktionieren.
Zum Source: ich habe nur mal schnell drübergeschaut, aber keinen Fehler gefunden. Allerdings ist das Skript teilweise wirklich _sehr_ umständlich geschrieben. Hat dein Skript denn überhaupt Zugriffsrechte auf die Datei, die es überschreiben will?
bye, Frank!
Hi,
weil mein Counter (von Goweb) in letzter Zeit nicht gerade zuverlässig ist, habe ich mich entschlossen, ein Counter in PERL zu schreiben. Soweit so gut. Auf meinem Rechner (Win95) läuft es einwandfrei. Auf meiner Site (Apache unter Unix) läuft es leider nicht. Ich habe auch die nötigen Sachen angepaßt und die Zugriffsrechte auch (ich hab's mit 777 und 755 probiert).
755 muß reichen. Ist der Server denn für CGI konfiguriert? Laufen andere CGIs, ist also z.B. das cgi-bin auch richtig ge-chmod-et?
#!/usr/bin/perl
Ich hoffe mal, das stimmt :-)
@zeilen = ("");
open(COUNT, "<$BASEDIR/ml/count.txt");
while(<COUNT>)
»» {
»» push(@zeilen,$_);
»» }
close(COUNT);
open(COUNT,"<$BASEDIR/ml/count.txt");
$counter = <COUNT>;
close(COUNT);
Du willst doch nur eine Zeile drinhaben, oder? ;-) Außerdem solltest Du auch hier auf die richtigen Rechte achten. Alle Dateien und Verzeichnisse müssen (glaube ich) mindestens 644 haben, das Verzeichnis evtl. auch 666.
$counter = ++$zeilen[1]; #counter wird inkrementiert
Die erste Zeile 1 der Datei wäre $zeilen[0]!
@zeichen = split(//,$zeilen[1]); #Der Counterwert wird gesplittet (Counter besteht aus 4 Ziffern und wird in 4 Teilen geteilt)
#Erzeugung von HTML-Code
$grafik[0] = "<img src=../ml/digits/$zeichen[0].gif>";
$grafik[1] = "<img src=../ml/digits/$zeichen[1].gif>";
$grafik[2] = "<img src=../ml/digits/$zeichen[2].gif>";
$grafik[3] = "<img src=../ml/digits/$zeichen[3].gif>";
for ($i=0; $i<=3; $i++) { $grafik[$i] = "...$zeichen[$i].gif>"; }
#Counter-Datei wird mit dem neuen Wert überschrieben.
open(COUNT2, ">$BASEDIR/ml/count.txt");
print COUNT2 $counter;
close(COUNT2);
Du kannst ruhig COUNT wiederverwenden ;-)
»» <link rel=stylesheet type="text/css" href="../ml/style.css">
Nimm lieber 'nen absoluten Pfad. Wenn Du den richtigen relativen findest, geht das natürlich auch :-)
Einen richtigen Fehler konnte ich allerdings auch nicht finden. Hast Du die Datei im ASCII-Modus übertragen? Was sagt perl -c script.pl?
Cheatah
Hallo auch!
@zeilen = ("");
open(COUNT, "<$BASEDIR/ml/count.txt");
while(<COUNT>)
»» {
»» push(@zeilen,$_);
»» }
close(COUNT);
»»
$counter = ++$zeilen[1]; #counter wird inkrementiertDie erste Zeile 1 der Datei wäre $zeilen[0]!
In diesem Falle war es aber schon richtig!
Das Array wurde mit ("") initialisiert - hat also als Element 0 einen leeren String.
Die Zeilen der Datei werden per push hinten an das Array angefügt, so daß
die erste Zeile der Datei auch das Element Nummer 1 im Array ist. Man könnte
es hier so sehen, daß sich zwei Fehler gegenseitig aufgehoben haben ...
Einen Fehler, der das generelle Versagen des Skriptes bedeutet konnte ich aber
auch nicht erkennen. Wie äußert sich denn der Fehler ???
Jörk
Einen Fehler, der das generelle Versagen des Skriptes bedeutet konnte ich aber
auch nicht erkennen. Wie äußert sich denn der Fehler ???Jörk
hi!
also die Seite wird korrekt dargestellt (siehe http://www.marsline.de/cgi-marsline/counter.cgi )
nur der counter wird nicht inkrementiert und die Protokolldatei wird auch nicht beschrieben. Ich habe die Zugriffsrechte überprüft. Außerdem biete ich auf meiner Site die Möglichkeit Postkarten zu verschicken (dabei werden ebenfalls Dateien beschrieben) und es funktioniert einwandfrei! Das ist was ich nicht nachvollziehen kann :o(
Daniel
Hi Daniel!
also die Seite wird korrekt dargestellt (siehe http://www.marsline.de/cgi-marsline/counter.cgi )
nur der counter wird nicht inkrementiert und die Protokolldatei wird auch nicht beschrieben. Ich habe die Zugriffsrechte überprüft. Außerdem biete ich auf meiner Site die Möglichkeit Postkarten zu verschicken (dabei werden ebenfalls Dateien beschrieben) und es funktioniert einwandfrei! Das ist was ich nicht nachvollziehen kann :o(
Klingt aber in diesem Fall wirklich sehr nach Zugriffsrechten ...
Beim Überprüfen der Rechte solltest Du auch beachten, daß die Skripte meißt von einem
anderen User ausgeführt werden, als Dein account. Dieser User muß dann natürlich
entsprechenden Zugrif sowohl auf die Dateien als auch auf das Verzeichnis haben.
Könnt' ja helfen ...
Jörk