kostenloser Webspace werbefrei: lima-city


PHP-Counter macht unregelmäßige Resets

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    leonpl

    leonpl hat kostenlosen Webspace.

    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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;April 2002<br>"; //String, der zurueckgegeben wird, rechter Teil
    $showip=true; //Soll Ip des Benutzers angezeigt werden?
    $showipTextLeft="Ihre&nbsp;IP:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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;
    ?>
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. 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...
  4. Autor dieses Themas

    leonpl

    leonpl hat kostenlosen Webspace.


    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.
  5. 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 ^^
  6. $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! :eek:
  7. Autor dieses Themas

    leonpl

    leonpl hat kostenlosen Webspace.


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

  9. 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...
  10. 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 :wink:).

    MfG
    alopex
  11. 2**s

    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.
  12. 0******a

    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.
  13. Autor dieses Themas

    leonpl

    leonpl hat kostenlosen Webspace.


    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.
  14. 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
  15. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!