Stefan: counter der klicks auf ein bild zählt

Ich brauche eure Hilfe. Auf meiner Website möchte ich einen Counter installieren der zählt wieviel mal auf ein bestimmtes Bild geklickt wird. Zudem sollte es ein Adminmenü geben auf der dann angezeigt wird, wieviel mal auf das Bild geklickt wurde.

  1. Hi!

    Ich brauche eure Hilfe. Auf meiner Website möchte ich einen Counter installieren der zählt wieviel mal auf ein bestimmtes Bild geklickt wird. Zudem sollte es ein Adminmenü geben auf der dann angezeigt wird, wieviel mal auf das Bild geklickt wurde.

    OK. Und was ist jetzt die Frage?

    Grüße
    Andreas

  2. Zunächst mal Moin,

    Ich brauche eure Hilfe. Auf meiner Website möchte ich einen Counter installieren der zählt wieviel mal auf ein bestimmtes Bild geklickt wird. Zudem sollte es ein Adminmenü geben auf der dann angezeigt wird, wieviel mal auf das Bild geklickt wurde.

    Zieh Dir das:

    <twins.sumsebienchen.de/counter.zip>

    und dein link vom Bild muß dann so aussehen:

    <a href="counter.php?http://www.deine_url.de/dein_bild.jpg"><img .....></a>

    regds
    Mike

    1. Hallo,

      <twins.sumsebienchen.de/counter.zip>

      Bei Links hier im Forum musst du auch das Protokoll angeben. In diesem Fall also HTTP.
      Der richtige Link: http://twins.sumsebienchen.de/counter.zip

      Jonathan

      1. Hello,

        Der richtige Link: http://twins.sumsebienchen.de/counter.zip

        Ich möchte darauf hinweisen, dass die Locking-Strategie in diesem Script nicht greift:

        flock($fp, 1);
        fputs($fp, $file);
        flock($fp, 3);
        fclose($fp);

        Es handelt sich bei diesen PHP-Funktionen um "advisory locking". Das bedeutet, dass in einer Tabelle ein Vermerk gesetzt wird, dass die Dateisperre nun bitte zu beachten ist. Die Beachtung der Dateisperre kann aber nur durch das Abfragen des Funktionsergebnisses von flock() wahrgenommen werden.

        Die Funktion fputs() bekommt von ggf. tatsächlich angemeldeten Lock überhaupt nichts mit. Dazu müsste man mit "mandatory locks" ("HardLock") arbeiten.

        Richtig wäre also:

        for($lockcount = 0; $lockcount < 5; $lockcount++)
        {
          if (@flock($fp, 1))   ## Fehlermeldung muss hier ausgeschaltet werden
          {
            fputs($fp, $file);
            flock($fp, 3);
            break;
          }
          else
          {
            # Fehlerbehandlung
          }
        }

        fclose($fp);

        Außerdem ist das Locken an dieser Stelle zu spät, wenn die datei nur geschreiben wird. Beim Locking muss man generell sicherstellen, dass zwischen dem letzten eigenen Lesevorgang und dem eigenen Schreibvorgang kein weiterer Schreibvorgang stattgefunden hat. Das kann man auf drei Arten erreichen:

        1. Man lockt von vor dem Lesen bis nach dem Schreiben exclusiv
           Das nennt man dann "pessimistic locking strategie"
           Diese methode lässt sich am einfachsten umsetzen.
           Beispiel: http://bitworks.de/~selfHTML/speichern.php

        2. Man fügt einen "Conflict Counter" hinzu, der bei jedem Schreibvorgang
           um eins hochgezählt wird. Geschrieben werden darf aber nur, wenn sich
           der Conflict Counter seit dem letzten Lesen nicht verändert hat.
           Das bedeutet aber, dass man innerhalb des Locks den Zähler nochmals
           lesen muss. Nur wenn er sich seit dem lezten Lesen vor Beginn der
           Datenmanipulation bis jetzt nicht geändert hat, darf er um eins er-
           höht werden, und es wird weggeschrieben.
           Das nennt man dann "optimistic locking strategie", dam nan eigentlich
           davon ausgeht, dass der Conflict-Handler i.d.R. nicht anspricht. Diese
           Methode erfordert zwar eien zusätzliche Leseoperation, ist aber in
           Bezug auf paralleles Lesen von Datenbeständen performanter.

        3. Man nutzt die "academic locking strategie".
           Hier wird jeder Veränderungswunsch von Daten damit eingeleitet, dass
           versucht wird, einen exclusiv Lock zu setzen. Hat dieser Erfolg, wird
           sofort auf "shrared read lock" zurückgenommen. So kann jede andere
           Applikation (jeder andere User) die Daten noch lesen, aber er erfährt
           beim eigenen Wunsch, die Daten zu verändern, dass dies im Moment nicht
           möglich ist, da er keinen exclusiv lock setzen kann, solange ein shared
           read lock gestzt ist. Den darf er nun aber auch selber nicht mehr setzen,
           da er damit verhindern würde, dass der erste User nach Abschluss seiner
           Manipulation für den kurzen Moment des Schreibvorganges aus exclusive
           lock "hochschaltet".

        Dieses Verfahren funktioniert auch bestens mit mandatory locking und
           bietet dann die höchsate Datensicherheit.

        Rein physisch ist eine Datei solange für andere Prozesse gesperrt, wie ein Prozess darauf zugreift. Da die Zugriffsdauern  sich aber im Millisekundenbereich bewegen, muss man schon einige Hundert Zugriffe pro Sekunde auslösen, um einen _physischen_ Konflikt herbeizuführen. Das hatte z.B. Sven Rautenberg in unserem Versuch mit dem Speichern-Script gemacht. Da ich die Datei nicht lesen konnte und den Grund des Nicht-Lesen-Könnens nicth abgefragt habe, (nur boolesch, keine Fehlernummer), hat meine Scriptinstanz die Daten neu initialisiert, da sie davon ausging, dass die Datei nicht vorhanden war. Wenn ich die Fehlernummer abgefragt hätte, wäre "Access denied" dabei herausgekommen, was etwas anderes ist als "File not found".

        Soviel zum Arbeiten mit Locks und dem Sumsebienchen-Script.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hello,

          Richtig wäre also:

          verflixt nochmal, selbst die Locking-Methode hat im Sumsebienchen-Script  nicht gestimmt und ich hab's übersehen. Sorry.

          for($lockcount = 0; $lockcount < 5; $lockcount++)
          {

          if (@flock($fp, 2))   ## exclusives Locking!

          {
              fputs($fp, $file);
              flock($fp, 3);
              break;
            }
            else
            {
              # Fehlerbehandlung
            }
          }

          fclose($fp);

          siehe http://de2.php.net/manual/de/function.flock.php

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          1. Hello,

            Chritians Einwand ist ebenfalls berechtigt. Also wäre _eine_ saubere
            Lösung nun diese:

            for($lockcount = 0; $lockcount < 5; $lockcount++)
            {
              if (@flock($fp, 2))   ## exclusives Locking!
              {
                fputs($fp, $file);
                fflush($fp);
                flock($fp, 3);
                break;
              }
              else
              {
                usleep(8000);      #8ms warten. Funktioniert nicht bei WIN

            # Fehlerbehandlung nacxh Belieben
                # Wenn Fehlerzähler >= 4. ggf Exception generieren
              }
            }

            fclose($fp);

            Festzustellen wäre noch, ob flock() nicht von sich aus auf der Systemebene mehrere Lockversuche durchführt. Beim guten alten DOS waren das defaultmäßig z.B. immer fünf Versuche in Seeehr kurzem Abstand. Außerdem sollte man für den Misserfolgszeit eine Delay-Time einbauen (usleep()).

            siehe auch:
              http://de2.php.net/manual/de/function.flock.php
              http://de3.php.net/manual/en/function.fflush.php

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        2. Hallo Tom,

          fputs($fp, $file);
              flock($fp, 3);

          Das halte ich für gefährlich. Es könnte nämlich sein, dass die Daten von fputs() noch in einem Puffer sind. Wenn Du nun das Lock entfernst, kann es dann doch zu Problemen kommen. Daher wäre es sinnvoll, die Datei an dieser Stelle einfach zu schließen (damit würde das Lock automatisch entfernt) oder zumindest vorher ein fflush() durchzuführen, damit auch alle Änderungen geschehen sind.

          Viele Grüße,
          Christian

  3. Hello,

    Ich brauche eure Hilfe. Auf meiner Website möchte ich einen Counter installieren der zählt wieviel mal auf ein bestimmtes Bild geklickt wird.

    Ich habe gerade die letzten Tage ein Musterscript für sowas fertig gemacht. Mit ein wenig PHP-Kenntnissen kann man das für seine Zwecke umbauen. Sven Rautenberg hat es dann in einer Crash-Test-Aktion zum Absturz gebracht und ich habs (hoffentlich) nun soweit, dass es alle notwendigen Elemente enthält. (Die Zähldateien müssen in der realen Anwendung später außerhalb der Doc-Root liegen oder mit .htaccess abgeschirmt werden)

    http://bitworks.de/~selfHTML/speichern.php

    Viel Erfolg

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen