Steffi: Counter zählt falsch?

Hallo,

ich habe einen Hit Counter erstellt, aber er zählt falsch. Am morgen hatte ich 78 Hits, stattdessen irgendwas mit 200 Hits.
Ist Code vielleicht falsch?

<?php
$fp=fopen("count.txt","r+");
$counter=fgets($fp,100);
if (mktime(0,0,0)>filemtime("count.txt"))
{
    $counter = 1;
}
else
{
    $counter++;
}
echo $counter;
rewind($fp);
fputs($fp,$counter);
fclose($fp);
?>

LG
Steffi

  1. Hallo,

    Sehe ich das richtig, dass dein Counter ohne Rücksicht auf Session oder IP-Adresse oder sonstiges einfach bei jedem Aufruf hochzählt? Wenn ja, schon mal über einen Crawler einer Suchmaschine nachgedacht? Der könnte beim einmalige Ablaufen der Seite direkt dutzende Hits verursachen.

    MfG
    Rouven

    --
    -------------------
    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
  2. Hello,

    Ist Code vielleicht falsch?

    Er ist zumindest unvollständig.
    Eine Webseite ist normalerweise ein Multi-User-Objekt. Da die Webserver im Regelfall durchaus 150 parallele Prozesse darauf zulassen, muss man sich also um eine Strategie für gemeinsame Nutzung kümmern.

    <?php

    War die datei schon da?

    sonst sollte man ein

    $fp=fopen("count.txt","a");
    fclose($fp);

    voransetzen

    #> $fp=fopen("count.txt","r+");

    besser:

    $fp=fopen("count.txt","rb+");

    da auch Textorientierte OS dann die Datei binär öffen

    #(was bei PHP allerdings hier nicht unbedingt erforderlich ist, da selten

    binäre Speicherung von Zahlen stattfindet, sondern diese als ASCII-Zeichen abgelegt werden

    jetzt muss man aber erst ein LOCK beantragen

    flock($fp,LOCK_EX);

    $counter=fgets($fp,100);

    if (mktime(0,0,0)>filemtime("count.txt"))

    wozu ist die Zeile da, wenn Du die Datei doch vorhin gar nicht neu angelegt hast?

    {
        $counter = 1;
    }
    else
    {
        $counter++;
    }
    echo $counter;
    rewind($fp);
    fputs($fp,$counter);
    fclose($fp);
    ?>

    Ordentliche Fehlerbehandlung müsste noch eingebaut werden!

    Außerdem solltest Du keine unstrukturierten Daten ablegen.
    Wenn Du den Einwand von Rouven berücksichtigen willst, dass ein Zugriff von derselben IP auf den Counter innerhalb z.B. 30 Sekunden abgewehrt werden soll, dann musst Du schon mehr als eine einzige Zahl abspeichern. Dafür eignen sich serialiserte assoziative Arrays.

    Harzliche Grüße vom Berg
    esst mehr http://www.harte-harzer.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau