Tom: Besucherzähler

Beitrag lesen

Hello,

Das ist der Code der letztendlich rausgekommen ist.

Sieht schon besser aus.

Habe nur den Anfang ändern müssen, weil ich noch aus einem anderen Unterverzeichnis auf die Dateien zugreifen wollte.
Außerdem habe ich die Dateien umbenannt, sodass diese über den Apache-Server nicht ausgeliefert werden...

Über den Sinn und Unsinn solcher Zähler kann man ja wunderbar streiten. Aber ich denke, als Lernobjekt für Nebenläufigkeit sind sie gut geeignet. Leider hast Du die hier überhaupt noch nicht berücksichtigt und darum ist die Version auch nicht stabil.

Sowie tatsächlich konkurrierender Betrieb auftritt, der auf einer auch nur mäßig besuchten Webseite immer herrschen sollte, dann gehen Dir die Dateien kaputt.

Außerdem hast Du die Längen-Änderung der Dateiinhalte noch nicht berücksichtigt.

<?php

$ipdatei = fopen(dirname( FILE ).'/.htips',"r+");
   $counterdatei = fopen(dirname( FILE ).'/.htcounter',"r+");

if ($ipdatei and $counterdatei)
     {
         if (flock($ipdatei, LOCK_EX) and              ## Dateien gegen andere Prozesse schützen
             flock($counterdatei, LOCK_EX))            ## während man selber darin arbeitet
         {

$currentip = $_SERVER["REMOTE_ADDR"];

$lastip = fgets($ipdatei, 21);            ## 4*3 + 3 + 2 = 17, also lang genug
           $counterstand = fgets($counterdatei, 10); ## acht- bis neunstellig dezimal

#>            if($counterstand == "")
#>            {
#>                $counterstand = 0;
#>            }

$counterstand = intval($counterstand);   ## macht PHP aber nachher automatisch,

## wenn Du damit rechnest
            if($currentip != $lastip)
            {
                $counterstand = $counterstand + 1;

#>                 echo $counterstand;

rewind($ipdatei);
                fwrite($ipdatei, $currentip);

ftruncate($ipdatei, ftell($fh)+1);      ## IP-Sttings können unterschiedlich
                                                          ## lang sein

rewind($counterdatei);
                fwrite($counterdatei, $counterstand);

ftruncate($counterdatei, ftell($fh)+1); ## das ist nicht notwendig, wenn
                                                          ## das Literal für den Zählerstand
                                                          ## immer länger wird.

}

#>            else
#>            {
#>                echo $counterstand;
#>            }
              echo $counterstand;
          }

fclose($ipdatei);
        fclose($counterdatei);

}
      else
      {
          echo "kein Zählerstand verfügbar";
      }

?>

  
  
Ich habe noch ein bisschen darin herumgeändert. So sollten die Probleme bezüglich konkurrieredem Betrieb und Längenanpassung der Dateien erledigt sein.  
Beachte auch die auskommenterierten Zeilen. Die fallen weg.  
  
  
Versuch doch nochmal, die beiden Daten in eine Datei zu scheiben.  
Dazu gibt es in PHP unterschiedliche Möglichkeiten (Nach Bequemlichkeit geordnet):  
  
- serialize() und unserialize() <http://de.php.net/manual/de/function.serialize.php  
- substr() und str_pad()        [link:http://de.php.net/manual/de/function.str-pad.php>  
- pack() und unpack()           <http://de.php.net/manual/de/function.pack.php>  
  
Wie Du siehst, treten die Funktionen immer paarig auf. Behandlung der Daten nach der Verarbeitung vor dem Wegschreiben - Behandlung der Daten nach dem Wiederholen vor der Verarbeitung.  
  
  
  
  
Liebe Grüße aus dem schönen Oberharz  
  
  
Tom vom Berg  
![](http://selfhtml.bitworks.de/Virencheck.gif)  
  

-- 
Nur selber lernen macht schlau  
<http://bergpost.annerschbarrich.de>