Problem: Gleicher Bild-Counter auf verschiedenen Webseiten

Hallo Leute,
ich habe ein Problem, und ich hoffe ihr könnt mir helfen…

Ich habe einen bildbasierten Counter geschrieben, der auf einer Webseite per:

<img src="http://127.0.0.1:4001/counter.php?uid=12345">eingebunden wird. Jetzt das Problem:

Wenn der Counter mit dem gleichen UID auf verschiedenen Webseiten gleichzeitig eingebunden wird (testweise auf einer HTML-Seite mit mehreren IMG-Tags), gibt er auf den verschiedenen gerenderten Bildern beim Refresh aufsteigende Counterwerte aus.

Dann bei weiteren Refreshes wird die Datei, aus der gelesen und geschrieben wird, auf 0 Byte gesetzt.
Zum Lesen und Schreiben verwende ich den Script:

if (file_exists("stats/$uid.txt"))
{
$datei=fopen("stats/$uid.txt","r");
$zaehler=fgets($datei,11);
fclose($datei);
}

$zaehler++;
$datei=fopen("stats/$uid.txt","w");
fputs($datei,"$zaehler");
fclose($datei);

//Bild erzeugen

Frage: Warum genau ist das so und wie kann ich Abhilfe schaffen, damit der Counter auf verschiedenen Webseiten gleichzeitig eingebunden werden kann?

MfG, xcube

Moin,

bei dir fehlt entweder ein IP Abgleich bzw. ein Cookie. Bisher wird nur wenn die Datei existiert, der Zähler erhöht - also bei jedem Aufruf.

Du musst also prüfen, ob der Benutzer bereits vom Zähler erfasst wurde. Hilfe schafft da ein IP-Abgleich bzw. Session/Cookies.

MfG
myPages

In der Tat bei schnellen Aufruffolgen konnte ich das nachvollziehen.

Habe aber noch nicht heraus bekommen woran das liegt.

Du musst den Zugriff auf die Datei umbedingt sperren, bevor du in die Datei schreibst, ansosnten kommt es zur leerung, weil die 2te Instanz des Scriptes einen Lehren Wert ausliest :wink:

at2.php.net/flock

wenn du die Funktionen file_get_contents und file_put_contents verwendest, wird die Datei automatisch gesperrt :wink:

So so :smiley: :smiley: :smiley: :winke: … ahem

Habe es bei mir heraus gefunden, Schuld ist Status Cache der über file_exists gefüllt wird.

Ein clearstatcache () hat da bei mir geholfen, aber ist überflüssig.

Kann man aber auch abkürzen:

$z=@file_get_contents($datei);
$z++;
@file_put_contents($datei,$z);

Habe das in einer Schleife über mehrere Browserinstanzen gleichzeitig a 10000 mal laufen lassen, hat einwandfrei gezählt.

danke leute :smiley:
ciao, xcube