PHP-Counter macht unregelmäßige Resets
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ahnung
anzahl
art
besucher
break
datei
fehler
file
glauben
gleiche zahl
jaja
kollision
nachtrag
problem
schliessen
stehen
string
vorkommen
zahl
zugriff
-
Hi an alle,
also ich hab mir einen Counter mit IP Sperre geschrieben(ich wei? es gibts zig davon, aber ich wollte meienen eigenen) und eigentlich l?uft er ganz gut, nur ab und zu halt speichert er die neue CounterZahl als 0 ab, und l?scht halt auch somit meine bisherige Besucheranzahl.
Ich wei? aber auch nicht woran das liegen soll, denn die IPs scheint er richtig abzuspeichern, vielleicht bei der Konvertierung des Strings in eine Dezimalzahl? Oder ist es kritisch wenn wirklich mal 2 Leute gleichzeitig die Datei anfordern?
Der Counter nimmt eine Datei und speichert in der ersten Zeile die neue Besucheranzahl und darunter pro Zeile die geblockten IPs.
Vielleicht hatte ja jemand von euch ein ?hnliches Problem, thx.
<?php
$datei="./inc/counter.txt"; //Datei zum Speichern de sZaehlers und der geblockten ips
$anzips=5; //Anzahl der zu blockenden ip's
$counter="0"; //Counter-Variable
$counterTextLeft="<p class=\"mini\"><b>"; //String der zurueckgegeben wird, linker Teil
$counterTextRight="</b> Besucher seit<br> April 2002<br>"; //String, der zurueckgegeben wird, rechter Teil
$showip=true; //Soll Ip des Benutzers angezeigt werden?
$showipTextLeft="Ihre IP:<br> <i>"; //String vor Rueckgabe der IP
$showipTextRight="</p></i>"; //String nach Rueckgabe der IP
$file=@fopen($datei, "r");
if($file){
$counter=fgets($file, 20);
for($i=0;$i<$anzips; $i++){
$ip=fgets($file, 20);
if($ip) $ips[$i]=$ip;
else break;
}
fclose($file);
if(!in_array($_SERVER['REMOTE_ADDR']."\n", $ips))
{ @$file=fopen($datei, "w");
if($file){
$counter=intval($counter)+1;
fputs($file, $counter."\n");
for($i=$anzips-1;$i>0;$i--) $ips[$i]=$ips[$i-1];
$ips[0]=$_SERVER['REMOTE_ADDR']."\n";
for($i=0;$i<sizeof($ips);$i++) fputs($file, $ips[$i]);
fclose($file);
}
}
}
echo $counterTextLeft.$counter.$counterTextRight;
if($showip) echo $showipTextLeft.$_SERVER['REMOTE_ADDR'].$showipTextRight;
?> -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ich hab zwar net so viel Ahnung von PHP ,aber ich glaube der Fehler liegt einfach hier :
counter="0"; //Counter-Variable
wenn du die Datei ausf?hrst, dann setzt er den counter immer wieder auf 0.
Du musst die Variable schlie?lich nur einmal zu initialisieren, jede weitere initialisierung sorgt daf?r, das sie wieder zum Ursprung zur?ckkehrt.
Kann aber auch gut sein, das ich mich irre... -
ich hab zwar net so viel Ahnung von PHP ,aber ich glaube der Fehler liegt einfach hier :
counter="0"; //Counter-Variable
wenn du die Datei ausf?hrst, dann setzt er den counter immer wieder auf 0.
Ich glaube nicht denn sp?ter kommt
$counter=fgets($file, 20);
Dieses $counter=0; habe ich gemacht damit selbst wenn die Datei leer ist das Skript keine Fehler ausspuckt. Oder ich irre mich. Und au?erdem funktioniert das Skript ja in der Regel, nur manchmal kommt ein Reset und nicht jedesmal. Trotzdem danke.
-
ich hab keine ahnung wie das kommt, aber ich hab da eine idee wie man das ganz einfach un unproffessionell l?sen kann, d?rfte aber auch seinen zweck tun: du f?gst einfach ein if ein (vor dem ?berschreiben der datei) das sagt if ($counter >2){ oder so...
auf die art kann es fast zu keinem reset kommen ^^ -
ich hab keine ahnung wie das kommt, aber ich hab da eine idee wie man das ganz einfach un unproffessionell l?sen kann, d?rfte aber auch seinen zweck tun: du f?gst einfach ein if ein (vor dem ?berschreiben der datei) das sagt if ($counter >2){ oder so...
auf die art kann es fast zu keinem reset kommen ^^
Also ganz abgesehen davon, dass solche L?sungen schei?e sind, glaube ich nicht dass das was n?tzt, denn dann ist der reset doch schon geschehen, oder nicht?
$anzips = 5 //Anzahl zu blockender IPs
was solln das bitte ?? was ist wenn du mal mehr als 5 user auf deiner hp hast..
jaja sowas soll vorkommen!
haste dir mal die Homepage angeguckt? Au?erdem tr?gt das nicht zur L?sung des Problems bei, da k?nnte auch 50000 stehen und das Problem w?re noch da. -
prinzipiell sieht dein quelltext in ordnung aus, was nicht hei?en soll dass er korrekt ist, aber ich w?rde auf den ersten Blick auch sagen es liegt an kollisionen von usern.
Ich w?rde um das zu ?berpr?fen eine Kopie der Datei anlegen.
Schl?gt der Zugriff auf die erste Datei fehl greifst du auf die zweite zu und addiertst statt 1 eine 2, weil du ja das Ergebniss des ersten Users ?berschreiben wirst. Die IP des ersten Users geht dir dann zwar fl?ten, aber dein Gesamtergebnis ist immer noch ganz gut.
Am Schlu? musst du nat?rlich eine neue Kopie anlegen.
(Das ist keine besonders sch?ne L?sung hilft dir aber rauszufinden ob es an den Kollisionen liegt.)
Um Kollisionen wirklich zu vermeiden, solltest du einen Counter mit Datenbankzugriff bauen.
greetz -
Also ganz abgesehen davon, dass solche L?sungen schei?e sind, glaube ich nicht dass das was n?tzt, denn dann ist der reset doch schon geschehen, oder nicht?
nein, weil nur die php datei den reset bewirken kann, und wenn die nicht die m?glichkeit hat, einen wert der kleiner ist als drei zu speichern wird es zu keinem reset kommen... -
Hallo leonpl!
Setz doch einfach mal die Variable $counter beim Initialisieren auf einen sehr hohen Wert, z.B. 7777777. Sollte dein Script jetzt irgendwann diesen Wert in die Counter-Datei schreiben, hast du die Best?tigung, das kein "Reset" erfolgte, sondern irgendwo eine Bedingung auftrat, die du nicht abgefangen hast, d.h. der Counter hat einfach seinen Initialwert behalten. Zum Code-Analysieren bin ich jetzt zu faul (das liegt vor allem an der Unm?glichkeit, hier im Board Quellcodes einger?ckt und ordentlich darzustellen und nicht an deinem Programmierstil ).
MfG
alopex -
Dieser reset kommt immer dann, wenn genau 2 leute gleichzeitig auf die Datei zugreifen, da der Zugriff auf die Datei nihct synchronisert wird.
Hatte das Problem auch mal mit Dateien.
Habe dann folgende Funktion beutzt, was das Problem zu 90% behoben hat.
http://de.php.net/manual/de/function.flock.php
Aber ab und zu kam bei einem gleichzeitigen Zugriff wieder murks raus.
Deshalb bin ich doch auf eine DB umgestiegen, da dort die gleichzeitigen Zugriffe kein problem sind, da die DB synchronisiert. -
Du hast dieses Problem, da du nicht ?berpr?fst, was du aus der Datei liest. Im Falle der IP-Adressen ist das nicht weiter tragisch, nach dem
$counter=fgets($file, 20);
solltest du aber eine Abfrage auf
$counter !== false
bevor du weiter, was mit der Datei machst. Sollte $counter false sein (und boolean), solltest du die Datei einfach nur schliessen, da gerade dadrin geschrieben wird.
Dann gibt es nur noch zwei Probleme:
1. du hast gerade wen beim Z?hlen ?bersprungen.
2. wenn zwei Besucher gleichzeitig auftauchen, besteht die M?glichkeit, das beide ablaufenden Skripte die selbe Zahl aus der Datei lesen und auch beide die gleiche Zahl wieder in die Datei schreiben. Zwei Besucher, zwei Lese- und Schreiboperationen ohne Fehler und trotzdem wurde nur einer gez?hlt...
Viel Spass mit Dateien weiterhin
Nachtrag:
!== ist Absicht, von != w?rde ich in diesem Fall abraten, ausser man stellt sicher, dass in der Datei niemals "0" als Anzahl stehen wird. -
Du hast dieses Problem, da du nicht ?berpr?fst, was du aus der Datei liest. Im Falle der IP-Adressen ist das nicht weiter tragisch, nach dem
$counter=fgets($file, 20);
solltest du aber eine Abfrage auf
$counter !== false
bevor du weiter, was mit der Datei machst. Sollte $counter false sein (und boolean), solltest du die Datei einfach nur schliessen, da gerade dadrin geschrieben wird.
Dann gibt es nur noch zwei Probleme:
1. du hast gerade wen beim Z?hlen ?bersprungen.
2. wenn zwei Besucher gleichzeitig auftauchen, besteht die M?glichkeit, das beide ablaufenden Skripte die selbe Zahl aus der Datei lesen und auch beide die gleiche Zahl wieder in die Datei schreiben. Zwei Besucher, zwei Lese- und Schreiboperationen ohne Fehler und trotzdem wurde nur einer gez?hlt...
Viel Spass mit Dateien weiterhin
Nachtrag:
!== ist Absicht, von != w?rde ich in diesem Fall abraten, ausser man stellt sicher, dass in der Datei niemals "0" als Anzahl stehen wird.
-
Hab mir den Quelltext doch mal angekuckt. Der Fehler k?nnte auch hier liegen:
if($ip) $ips[$i]=$ip;
else break;
}
fclose($file);
if(!in_array($_SERVER['REMOTE_ADDR']."\n", $ips))
{ @$file=fopen($datei, "w");
Du schlie?t erst die Datei, und danach ?ffnest du sie wieder. In der Zwischenzeit kann ein weiterer Besucher eine weitere Instanz dieses Skriptes aufrufen, die an der Datei manipulieren kann. Du solltest ?nderungen an der Datei in einem Rutsch erledigen, dann wird ein Fremdzugriff verhindert: Solange die Datei mit fopen() ge?ffnet ist, ist sie f?r andere Zugriffe gesperrt. ?blicher Openmodus f?r gleichzeitiges Lesen und Schreiben ist 'r+'. Das Script erinnert mich stark an ein Beispiel aus dem Buch "PHP - Webseiten dynamisch programmieren" von Michael Seeboerger-Weichselbaum, eine Ausgabe von 9,90 EUR, die ich heute noch bereue, weil nahezu wertlos f?r fortgeschrittenes PHP-Programmieren.
MfG
alopex -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage