Daniel: Counter in Perl.

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__

  1. 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!

  2. 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

    1. Hallo auch!

      @zeilen = ("");
      open(COUNT, "<$BASEDIR/ml/count.txt");
      while(<COUNT>)
      »»  {
      »»  push(@zeilen,$_);
      »»  }
      close(COUNT);
      »»
      $counter = ++$zeilen[1]; #counter wird inkrementiert

      Die 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

      1. 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

        1. 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