Ankündigung

Einklappen
Keine Ankündigung bisher.

Counter stellt sich unregelmäßig zurück

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Counter stellt sich unregelmäßig zurück

    Hallo, ich habe mir vor Unzeiten mal ein Counter Script "pgcCounter" runtergeladen und verwendet, habe selber kaum bis gar keine Ahnung von PHP. Leider stellt sich dieser Counter in sehr unregelmäßigen Abständen wieder zurück auf Null (die Statistiken werden in Textfiles abgelegt), und ich habe keine Ahnung warum und wie ich das abstellen kann. Habe auch schon gegoogelt und bei anderen Countern ähnliche Probleme gelesen, aber nicht bei diesem - und das offizielle Support-Forum dazu scheint es nicht mehr zu geben. Kann mir da jemand weiterhelfen?

    hier der Code der zugehörigen PHP-Datei:
    Code:
    <?
    function gettemplate($template)
    {
      return str_replace("\"","\\\"",implode("",file($template)));
    }
    
    function dooutput($template)
    {
      echo $template;
    }
    
    //#####Useronline ausgeben#####
    
    $i = 0;
    $j = 0;
    
    $filearray = file($counter_path . "stats/useronline.txt");
    foreach($filearray as $num => $line)
    {
      $ip_timestamp_array = split("( |-)",$line);
      $ip[$i] = $ip_timestamp_array[0];
      $timestamp[$j] = $ip_timestamp_array[1];
    
      $fivemins_ago = time() - 300;
    
      if($ip[$i] == $REMOTE_ADDR)
      {
        $search_toremove = $ip[$i] . "-" . $timestamp[$j];
        $insert = $REMOTE_ADDR . "-" . time() . "\n";
        $datei = fopen($counter_path . "stats/useronline.txt", "r");
        $size = filesize($counter_path . "stats/useronline.txt");
        $contents = fread($datei, $size);
        fclose($datei);
        $massreplace = preg_replace("/$search_toremove/", $insert, $contents);
        $datei = fopen($counter_path . "stats/useronline.txt", "w");
        fputs($datei, $massreplace);
        fclose($datei);
      }
    
      if($fivemins_ago > $timestamp[$j])
      {
        $search_toremove = $ip[$i] . "-" . $timestamp[$j];
        $datei = fopen($counter_path . "stats/useronline.txt", "r");
        $size = filesize($counter_path . "stats/useronline.txt");
        $contents = fread($datei, $size);
        fclose($datei);
        $massreplace = preg_replace("/$search_toremove/", "", $contents);
        $datei = fopen($counter_path . "stats/useronline.txt", "w");
        fputs($datei, $massreplace);
        fclose($datei);
      }
    
      $i++;
      $j++;
    }
    
    $to_test = implode("", @file($counter_path . "stats/useronline.txt"));
    
    if (!strstr($to_test, $REMOTE_ADDR))
    {
      $put_in_file = $REMOTE_ADDR . "-" . time();
      $datei = fopen($counter_path . "stats/useronline.txt", "a+");
      fputs($datei, $put_in_file . "\n");
      fclose($datei);
    }
    
    $filearray = file($counter_path . "stats/useronline.txt");
    foreach($filearray as $num => $line)
    {
      $count_useronline++;
    }
    
    $maxuseronline_file = fopen($counter_path . "stats/maxuseronline.txt", "r");
    $maxuseronline = fgets($maxuseronline_file, 100);
    fclose($maxuseronline_file);
    
    if($count_useronline > $maxuseronline)
    {
      $maxuseronline_file = fopen($counter_path . "stats/maxuseronline.txt", "w");
      fputs($maxuseronline_file, "$count_useronline");
      fclose($maxuseronline_file);
    }
    
    //#####Reset IP-List alle 24h immer 0 Uhr#####
    $lastreset_file = fopen($counter_path . "stats/lastreset.txt", "r");
    $lastreset = fgets($lastreset_file, 100);
    fclose($lastreset_file);
    
    $today_code = date("dm");
    $lastreset_code = date("dm", $lastreset);
    $get_today_day = date("j");
    $get_today_month = date("n");
    $get_today_year = date("Y");
    $set_today_hour = 0;
    $set_today_minute = 0;
    $set_today_second = 0;
    
    $new_reset_timestamp = mktime($set_today_hour, $set_today_minute, $set_today_second, $get_today_month, $get_today_day, $get_today_year);
    
    if($today_code != $lastreset_code)
    {
      $ip_file = fopen($counter_path . "stats/ip.txt", "w");
      fputs($ip_file, "");
      fclose($ip_file);
    
      $lastreset_file = fopen($counter_path . "stats/lastreset.txt", "w");
      fputs($lastreset_file, "$new_reset_timestamp");
      fclose($lastreset_file);
    
      if(file_exists($counter_path . "stats/visitsjesterday.txt"))
      {
        unlink($counter_path . "stats/visitsjesterday.txt");
      }
    
      rename($counter_path . "stats/visitstoday.txt", $counter_path . "stats/visitsjesterday.txt");
      $visitstoday_file = fopen($counter_path . "stats/visitstoday.txt", "w");
      fputs($visitstoday_file, "");
      fclose($visitstoday_file);
    }
    
    
    //#####IP-Sperre#####
    $test_ip = implode("", @file($counter_path . "stats/ip.txt"));
    
    if (!strstr($test_ip, $REMOTE_ADDR))
    {
      $ip_file = fopen($counter_path . "stats/ip.txt", "a+");
      $add_ip_to_file = sprintf("%s,",$REMOTE_ADDR);
      fputs($ip_file, $add_ip_to_file);
      fclose($ip_file);
    
      $visits_today_file = fopen($counter_path . "stats/visitstoday.txt", "r");
      $visits_today = fgets($visits_today_file, 100);
      fclose($visits_today_file);
    
      $visits_today_to_file = $visits_today + 1;
    
      $put_visits_today_file = fopen($counter_path . "stats/visitstoday.txt", "w");
      fputs($put_visits_today_file, "$visits_today_to_file");
      fclose($put_visits_today_file);
    
      $all_visits_file = fopen($counter_path . "stats/all_visits.txt", "r");
      $all_visits = fgets($all_visits_file, 100);
      fclose($all_visits_file);
    
      $all_visits_to_file = $all_visits + 1;
    
      $put_all_visits_file = fopen($counter_path . "stats/all_visits.txt", "w");
      fputs($put_all_visits_file, "$all_visits_to_file");
      fclose($put_all_visits_file);
    }
    
    $get_visits_today_file = fopen($counter_path . "stats/visitstoday.txt", "r");
    $get_visits_today = fgets($get_visits_today_file, 100);
    fclose($get_visits_today_file);
    
    $all_visits_file = fopen($counter_path . "stats/all_visits.txt", "r");
    $all_visits = fgets($all_visits_file, 100);
    fclose($all_visits_file);
    
    $get_visits_jesterday_file = fopen($counter_path . "stats/visitsjesterday.txt", "r");
    $get_visits_jesterday = fgets($get_visits_jesterday_file, 100);
    fclose($get_visits_jesterday_file);
    
    $get_maxuseronline_file = fopen($counter_path . "stats/maxuseronline.txt", "r");
    $get_maxuseronline = fgets($get_maxuseronline_file, 100);
    fclose($get_maxuseronline_file);
    
    if(!$invisible)
    {
      eval("dooutput(\"".gettemplate($counter_path . "counter.htm")."\");");
    }
    ?>
    Wäre super, wenn mir das jemand fixen kann. DANKE!

  • #2
    Hallo Serena77,

    zunächst Herzlich Willkommen im Forum.

    Wäre super, wenn mir das jemand fixen kann. DANKE!
    Sich selbst mit dem Thema nicht bechäftigen wollen und dann solche Forderungen zu stellen wird sicher keinen der hier Anwesenden mitreißen können...
    Viele Grüße,
    Dr.E.

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1. Think about software design [B]before[/B] you start to write code!
    2. Discuss and review it together with [B]experts[/B]!
    3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
    4. Write [I][B]clean and reusable[/B][/I] software only!
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Kommentar


    • #3
      Zitat von dr.e.
      Hallo Serena77,

      zunächst Herzlich Willkommen im Forum.

      Wäre super, wenn mir das jemand fixen kann. DANKE!
      Sich selbst mit dem Thema nicht bechäftigen wollen und dann solche Forderungen zu stellen wird sicher keinen der hier Anwesenden mitreißen können...
      Oh Mensch, warum ist in jedem Forum immer irgendjemand der einen gleich richtig schief anmacht wenn man eine Bitte hat? Weißt Du, wenn ich die Zeit dafür hätte würde ich das vielleicht sogar tun, der Grund warum ich aber ein vorgefertigtes Script verwende und mir nicht selber eines schreibe ist, daß ich diese nicht habe. Es geht auch nicht ums Wollen, und, kannst Du Dir vorstellen, es soll sogar Menschen geben die einfach nicht dazu in der Lage sind sowas zu lernen, weil deren Stärken auf anderen Gebieten liegen?

      Warum muß ich jetzt, um einen Counter auf einer Seite einzusetzen gleich eine ganze Sprache programmieren lernen, wenn es hilfbereite Menschen gibt?

      Warum soll ich nicht davon ausgehen, daß, wenn es Menschen gibt, die freiwillig und kostenlos nur so zum Spaß ein Script für andere zur Verfügung stellen, es auch welche gibt, die auf eine Nachfrage hin einen Fehler in einem solchen beheben würden?

      Ich stelle hier keine Forderungen sondern hatte nur eine Frage/Bitte, und es bleibt jedem selbst überlassen zu antworten oder auch nicht oder sogar einen Preis zu nennen oder auch einen Fingerzeig zu geben daß ich mich selber damit beschäftige - aber warum muß ich, völlig inhaltslos, angegriffen werden?

      Ich verstehe das nicht. Ich bin selber in Foren aktiv in denen mit Sachen umgegangen wird die ich kann und verstehe und ich würde nie auf die Idee kommen jemandem auf eine simple Frage hin so zu antworten: entweder ich weiß was, und helfe dann, oder ich weiß, wer/was helfen kann und verweise weiter oder ich lasse es einfach weil mich die Frage nervt/langweilt... Und trotzdem gibt es auch in "meinen" Foren immer Leute die gleich unfreundlich werden. Verstehen kann ich es trotzdem nicht.

      Tut mir leid daß ich es wagte. Vielleicht finde ich ein Forum zum Thema wo man noch Fragen stellen darf...

      Gruß

      Kommentar


      • #4
        Serena77, dieses wie die meisten anderen Foren ist dazu da, den Leuten zu helfen PHP zu erlernen, nicht ihnen kostenlos Arbeit abzunehmen. Das ist ein gewaltiger Unterschied. Außerdem basiert das Forum auf freiwilliger Arbeit. Wenn ich dein Posting sehe habe ich einfach keine Lust mich da reinzuwühlen, allein schon von der Art her wie du hier auftrittst. Nicht persönlich, ich kenne dich ja nicht, aber "macht ihr mal, keine Zeit" ist doch kein Argument. Ich hab ja auch nicht unendlich Zeit. Eine gewisse Netiquette musst du schon wahren.

        Beschäftige dich etwas mit dem Problem, etwas mit PHP (es ist nie verkehrt sich ein wenig auszukennen), versuche den Fehler einzugrenzen, dann helfen wir dir gerne.

        Kommentar


        • #5
          Du darfst sicherlich noch Fragen stellen, aber dr.e. hat schon Recht (und es zudem sehr treffend und freundlich ausgedrückt). Es geht ja nicht darum, dass wir jetzt auf unser hohes Ross steigen und uns einfach nicht damit auseinander setzen wollen. Es geht vielmehr darum, dass wir auch nicht unendlich Zeit haben. dr.e. sagte es, so wie es ist: Es gehört schon etwas Glück dazu jemand mal eben für eine solche doch gerne etwas umfangreichere Arbeit zu finden. Und viel Geduld ^^
          Nicht jeder Fehler ist ein Bug.

          Kommentar


          • #6
            Entschuldigung

            Also wenn ich schreibe "kann mir da jemand weiterhelfen?" und "Wäre super, wenn" und "DANKE", dann verstößt das gegen die Netiquette?

            Und wer sagte etwas von kostenlos - man kann ja auch gerne ein Angebot machen!

            Und "macht ihr mal, ich habe keine Zeit" - warum ist das kein Argument? Hat doch auch jemand gegeben, der dafür Zeit hatte das Script geschrieben und allen anderen die Zeit geschenkt, die die sich damit sparten - ist das der Einzige auf der ganzen Welt?

            Und warum muß ich von "jedem etwas können"? Programmieren ist eben nicht mein Beruf, kann ich nicht, warum muß ich das jetzt also lernen? Ich darf doch auch zum Zahnriemenwechsel in die Werkstatt gehen und muß das nicht selber lernen. Lieber mache ich "meine" Sachen gut und investiere darin Zeit - und helfe mit dem was ich wirklich kann wiederum gerne anderen!

            Außerdem begreife ich eines nicht ganz: laut Zergling muß ich mich nur "ein Bißchen " mit PHP und dem Problem beschäftigen und schon habe ich die Lösung - laut KingCrunch kann es aber eher eine "gerne etwas umfangreichere Arbeit" werden.

            Ist es jetzt also tatsächlich ein klitzekleines Problem das mit minimalen PHP-Kentnissen gelöst werden kann und Ihr wollt wirklich einfach nicht kurz helfen, oder ist es ein Riesenact und zuviel Arbeit - dafür hätte ich dann wirklich Verständnis, aber dann muß ich PHP ja von grundauf dafür lernen?

            Ich habe übrigens nicht gesagt, daß ich "SOFORT, JETZT GLEICH ABER AUF DER STELLE" eine Lösung fordere, ich habe freundlich um Hilfe gebeten von jemandem der will und irgendwann vielleicht Zeit hat wenn er mag (der Counter ist sicher nicht der Weltuntergang!)- und dafür ist ein Forum doch da, oder nicht?

            Falls das wirklich so mißverständlich gewesen sein sollte, wiederhole ich nochmal den Inhalt in einer anderen Form:

            Liebe Forenmitglieder, ich bin ein Noob, der leider zu doof zum Programmieren ist und sich deshalb irgendwo ein Script heruntergeladen hat. Dieses Counter-Script funktioniert leider nicht richtig. Da ich aber leider nicht die Zeit habe eine Programmiersprache zu lernen für einen winzigen Counter auf einer winzigen privaten Seite hoffe ich, daß sich vielleicht jemand findet der Spaß daran hat, mir mit diesem Problem weiterzuhelfen. Vielleicht kann mir ja bitte jemand einen Hinweis auf die fehlerhafte Logik oder einen fehlerhaften Befehl in dem Script geben, damit ich dann in SelfPHP gezielt nach einer Lösung suchen kann und nicht erst die Sprache von grundauf lernen muß. Oder vielleicht hat jemand bitte einen Link für mich, wo ich dieses Anliegen besser posten sollte. Oder vielleicht macht mir ja auch bitte jemand ein Angebot, wieviel eine Behebung des Fehlers kosten würde.

            Vielleicht will mir bitte jemand bei meinem Problem helfen trotz meines Eingeständnisses daß ich selbst wohl nie eine Programmiersprache erlernen werde. Wenn ich irgendjemandem mit dieser unverschämten Bitte zu nahe treten sollte tut mir das leid!

            Herzliche Grüße und vielen Dank im Voraus!

            Kommentar


            • #7
              Naja belassen wir es jetzt dabei.

              Als allgemeinen Tipp rate ich dir ein error_reporting(E_ALL); an den Beginn des Skriptes zu setzen.
              Wenn Datei-Counter auf 0 gesetzt werden hat das häufig die Ursache, dass die Datei nicht gelesen werden kann. Daraus resulitiert das Ergebnis NULL, false o.ä. welches in INT konvertiert 0 ergibt. Somit wäre der Reset eventuell erklärt. An welcher Stelle weiß ich nicht. Sollte das Skript aber sauber programmiert sein, wird bei einem Lesefehler selbiger ausgegeben und somit durch error_reporting(E_ALL) auch sichtbar.

              Wenn dein Counter nun mal wieder resetet, merk dir die Zeit und schau in den Logs nach, ob zu dieser Zeit ein PHP-Fehler oder -Notice geworfen wurde. Den kannst du dann hier posten.

              Was ich dir anbieten könnte wäre, dass wir zusammen ein neues Counter-Skript schreiben, offenbar kann dein aktuelles Counter-Skript nicht viel außer zählen von Zugriffen und IPs, das haben wir in 15 Zeilen Code (naja fast) locker nachprogrammiert, aber etwas schicker und vielleicht dann sogar mit einem Report bei Fehlern

              Kommentar


              • #8
                Dem Skript fehlt ein Schutz vor race conditions. Wenn zwei Benutzer praktisch gleichzeitig auf die Seite zugreifen, können sich die beiden dann praktisch gleichzeitig laufenden php Instanzen beim Lesen und Schreiben stören. Instanz 1 öffnet die Datei zum Schreiben, Ergebnis: Datei ohne Inhalt. In diesem Moment liest Instanz 2 aus der Datei, Ergebnis: keine Daten. Instanz 1 schreibt seine Daten und schließt die Datei. Instanz 2 schreibt seine "Daten" und schießt die Datei, Ergebnis: Neustart.
                Vielleicht suchst Du Dir besser ein neues Skript. Ich weiss aber nicht, ob es eine empfehlenswerte Seite für php Skripte mit Bewertung oder Besprechung der Skripte gibt.

                Kommentar


                • #9
                  schau mal hier rein:
                  http://www.developers-guide.net/foru...atei-basierend
                  Das ist zwar für ein Gästebuch gedacht - aber das kommt letztlich auf das gleiche raus.

                  und wenn du eine Datenbank zur Verfügung hast, dann rate ich dir von der text-Datei-version Abschied zu nehmen.

                  http://www.developers-guide.net/foru...rz-und-knackig
                  Aufstrebend, kompetent und [b]werbefrei[/b].
                  :arrow: [b][url=http://www.developers-guide.net]www.developers-guide.net[/url][/b]

                  Kommentar


                  • #10
                    dann fällt mir ad hoc noch auf, dass statt der variablen $_SERVER['REMOTE_ADDR'] einfach nur $REMOTE_ADDR; verwendet wird, was dazu führen kann, dass deine ip datei überläuft, da permanent nur kommas eingetragen werden und nicht die gewünschte ip

                    du solltest im script unbedingt $_SERVER['REMOTE_ADDR'] verwenden.
                    gruss sys

                    Kommentar


                    • #11
                      Hallo Leute,

                      vielen lieben Dank für die vielen hilfreichen Antworten.

                      Danke für das Angebot @zergling, aber mehr als wirklich nur das Zählen von Zugriffen brauche ich gar nicht, soviel Arbeit sollte also gar nicht reingesteckt werden.

                      @Schnulli: danke für den Tip, ich kenne solche Script-Seiten zuhauf, nur hatte ich mich so an "mein altes" Script gewöhnt, und bei neuen kann man meist ja auch nicht sicher sein daß sie funktionieren - die Bewertungen sind meist sehr wenig aussagend da reine Punktevergabe, man weiß dann nie worauf sich die Punkte genau beziehen (Handling, Installation, Kenntnisaufwand, Funktionalität?).

                      @supertramp: nein, leider habe ich wirklich nur eine winzige Seite mit winzigem Webspace und keine Datenbank. Deshalb werde ich mich jetzt mal in dieses Text-basierte Gästebuch einlesen, weiter unten sehe ich, daß es da genau um das Problem mit mehreren gleichzeitigen Zugriffen geht - vielleicht kann ich das irgendwie reinwurschdeln.

                      @sysop: In dem Zuge baue ich dann Deinen Tip auch gleich mit ein.

                      Vielen Dank Euch allen! You saved my day!

                      Kommentar


                      • #12
                        Hallo Serena77,

                        Danke für das Angebot @zergling, aber mehr als wirklich nur das Zählen von Zugriffen brauche ich gar nicht, soviel Arbeit sollte also gar nicht reingesteckt werden.
                        Für jemanden, der angibt keine Ahnung von PHP zu haben, ist das eigentlich nicht zu beurteilen. Du machst dich irgendwie unglaubwürdig...
                        Zergling spricht exakt die Themen an, die auch meiner Einschätzung nach zum Reset führen.
                        Viele Grüße,
                        Dr.E.

                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                        1. Think about software design [B]before[/B] you start to write code!
                        2. Discuss and review it together with [B]experts[/B]!
                        3. Choose [B]good[/B] tools (-> [URL="http://adventure-php-framework.org/Seite/088-Why-APF"]Adventure PHP Framework (APF)[/URL][URL="http://adventure-php-framework.org"][/URL])!
                        4. Write [I][B]clean and reusable[/B][/I] software only!
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

                        Kommentar


                        • #13
                          Ich fürchte, die race condition wird keinen besonderen Fehler auslösen, der in der Protokolldatei zu sehen ist.
                          file() liefert ein leeres Feld zurück, kein Problem für foreach()
                          implode("", file()) liefert eine leere Zeichenkette zurück, kein Problem für strstr() usw. usw.
                          Da wird einfach keine Fehlermeldung erzeugt.

                          Kommentar


                          • #14
                            Zitat von dr.e.
                            Hallo Serena77,

                            Für jemanden, der angibt keine Ahnung von PHP zu haben, ist das eigentlich nicht zu beurteilen. Du machst dich irgendwie unglaubwürdig...
                            Zergling spricht exakt die Themen an, die auch meiner Einschätzung nach zum Reset führen.
                            Hä? Zergling hat doch geschrieben er könne mir das ganze Script neu schreiben - das meinte ich mit viel Aufwand. Soviel Aufwand ein ganz neues Script schreiben zu müssen soll man nicht reinstecken. Ich dachte es handelt sich eventuell nur um einen kleinen Fehler (deshalb auch die ursprüngliche Frage) eben weil ich keinerlei Ahnung von PHP habe (ok, ich kann in vorhandenen Scripten nachlesen und eine neue Zeile
                            Code:
                            echo "Bliblablubb" . $bereitsvorhandeneVariable . "bliblablubb"
                            einfügen und eventuell eine if/then Schleife bauen (das kann ich noch aus TurboPascal-Zeiten, das sah fast gleich aus), das war's dann aber auch schon; weiter hat es in der Programmiersprachen-Logik schon damals nicht bei mir gereicht). Daß solch ein Aufwand betrieben werden müßte ein komplett neues Script zu schreiben hatte ich nicht gedacht - wo's, wie gesagt, ja schon fertige Script gibt wenn mannur sucht und sich umgewöhnen will.

                            Was war jetzt genau unglaubwürdig?

                            Kommentar

                            Lädt...
                            X