Unique Visitors

frosch1234

Grünschnabel
Hallo!

Wie würdet ihr Unique Visitors counten?

Man könnte natürlich einfach Sessions bzw. Cookies verwenden aber was wenn der User diese deaktiviert hat? also sowas kommt z.B. nicht in Frage.

Die einzige Möglichkeit die ich gefunden habe, die einigermassen verlässlich wäre, ist das blockieren von IPs verbunden mit einem Timeout. Sprich wenn 127.0.9.9 kommt wird dieser für 500 Sekunden oder so nicht noch einmal gecountet..
Gibt es bessere Möglichkeiten?
Und angenommen ich mach das so: wie würdet ihr die IPs speichern?
Also ich dachte natürlich an eine Datenbank in der einfach jede IP mit timestamp gespeichert wird.. oder eine simple Textdatei. Aber es ist doch schwachsinnig ältere IPs als mein Timeout gespeichert zu haben. Also dann ne Datenbank mit millionen von IPs zu haben und bei jedem hit nach der IP zu suchen und dann das timestamp zu checken (das natürlich schon ein Jahr alt sein könnte) ist meiner Meinung nach irgendwie primitiv.

Sprich das beste was mir einfällt ist bei jedem hit genau wie oben genannt die IPs mit Timestamps zu vergleichen und gleichzeitig veraltete Records zu löschen.
Oder würde die ganze Geschichte perfomanter sein wenn ich (wie oben als primitiv beschrieben) veraltete Records beibehalte und mein Table gut indiziere?
Im Endeffekt geht es mir ja nur um performance, wie primitiv oder anspruchsvoll die Lösung dann ist, ist mir ja _eigentlich_ ziemlich wurst ;)

Schöne Grüße,
Boris

PS: Ich konnte aufs verrecken nicht wirklich was zu dem Thema in der Suche finden. Hat mich auch gewundert. Tut mir leid wenn das Thema schon öffters da war.
 
Man könnte es ja so lösen das man einen Timestamp mit speichert wie du es schon geschrieben hast und anschließend eine Funktion schreibt, die an einem neuen Tag bzw nach einer gewissen Zeit alle Datensätze die Älter sind aus der Tabelle löscht.

Das dürfte Nutzer aber nicht hindern sich z.b. per Router Reset sich eine neue IP zu besorgen und so das Ergebnis beeinflussen können. Dazu könnetest du zusätzlich noch ein Timestamp in ein Flash-Cookie speichern damit dürfte es so ziemlich ein Unique-Counter sein.
 
Hi!
Danke für deine Antwort.
Ja denke ich werde im Endeffekt so eine Methode verwenden.
Flash-Cookie? was ist das?

Grüße,
Boris
 
Deinen Ansatz find ich schonmal richtig gut. Würde folgenden Ansatz wählen:
  1. Einträge, die älter als 900 (oder anderer Wert) Sekunden sind, werden gelöscht
  2. IP und Clientbrowser (und eventuell weitere Daten) werden mit Einträgen in der Datenbank abgeglichen, wenn schon existent, aktualisiere gespeicherten Timestamp auf aktuelle Zeit, ansonsten erzeuge neuen Datensatz
  3. Auslesen der Anzahl aller Datensätze in Tabelle

Für diesen Zweck würde ich eine schnelle Auslese empfehlen, wie sie etwa mit MySQL und MyISAM Engine möglich ist. Die MyISAM Engine speichert zB die Anzahl aller Datensätze in einer Tabelle, weshalb Abfragen, wie
SQL:
SELECT COUNT(*) FROM `table`
so schnell sind.

Die Architektur der Tabelle würde ich folgendermaßen gestalten:
Code:
         IP [integer]            |   Browserdaten [tinytext]   | Timestamp [datetime] 
---------------------------------+-----------------------------+----------------------
 ip2long($_SERVER['REMOTE_ADDR'] | $_SERVER['HTTP_USER_AGENT'] |        NOW()

Eventuell noch mit laufendem Index, aber ein Schlüssel auf alle so schon existierenden Felder würde sowieso nötig sein für höchste Performanz (und eine ID ist hinfällig, es sei denn, du möchtest die Datensätze auch daran identifizieren können).

Vor Proxy-Maskierungen kann man sich über verschiedene Wege, wie die Prüfung auf einige $_SERVER Indizien auch noch bedingt schützen, aber hierzu fallen mir gerade nicht die Schlüsselnamen ein. Was das Router-Reset angeht oder generell eine neue IP für einen Client, so kann man dies nur via Cookie oder Session nachvollziehen, denn irgendwie muss ja dieser auch wieder identifiziert werden können.
 
Hi!

Danke für deine professionelle Antwort..

Also Punkt zwei klingt interessant, du meinst das IP-Feld unique machen?
Das mit den $_SERVER Daten klingt auch nicht schlecht, daran hab ich garnicht gedacht.
Mit der ID gebe ich dir auch recht - scheint wirklich unnötig zu sein.

Grüße,
Boris
 
Unique kann, muss aber nicht, denn es hat an der Stelle keinen wirklichen Nutzen, außer dass die IP dann nur ein Mal in der Tabelle auftaucht. Andererseits wäre das ein Schutz vor Duplikaten, aber an dieser Stelle würde ich einen Unique Key über die beiden Identifier-Spalten legen (IP und Browserkennung), da ansonsten gleiche IP und unterschiedliche Browser auf die IP reduziert werden.

Zum Einfügen der Datensätze eignet sich der Performance wegen entweder REPLACE oder INSERT INTO ... ON DUPLICATE KEY UPDATE - Dazu findest du ne Menge im MySQL-Handbuch. Bin mir nicht sicher, aber ich dächte, dass zweiteres einen Ticken schneller läuft (und hier spielt dann der Unique Schlüssel eine Rolle).

Mit den Schlüsseln allgemein meine ich "Indizien" über die einzelnen Spalten, damit auf deren Werte schnell zugegriffen werden kann. Wenn zB kein Schlüssel über der Timestamp-Spalte hinge, würde das Löschen mit WHERE `timestamp` < DATE_SUB(NOW(), INTERVAL 900 SECOND) (un)wesentlich länger dauern als mit. Ebenfalls wäre der Zugriff auf die beiden anderen Spalten langsamer, wenn sie nicht indexiert werden. Die Schlüssel sind in MySQL eine Art Knoten und Identifizierungsmittel, die immer parat liegen. Wenn ich zB in einem Buchregister nach einem indexierten Wort suche, finde ich das auch schneller als wenn ich erst jedes Wort einzeln analysieren müsste - Die Indizies dienen also vor allem der Performance (Gehen aber zu Lasten des Speicherbedarfs).
 
Verstehe.

Danke für die ausführlichen Erklärungen. Ich muss gestehen nicht der Datenbank Oberchecker zu sein, von daher war das recht hilfreich ;)
Eine Frage: wieso indiziert man dann nicht einfach generell alle Spalten?

Grüße,
Boris
 
Bei einigen (eigentlich den meisten) Spalten ist das unnötig, da es a) mehr Speicherkapazität erfordert, b) Die Indexierung einmalig eine Mehrlast erzeugt, c) bei temporären Tabellen teilweise zu Performanceeinbußen kommt, da mehr ausgelagert und umgeschaufelt werden muss als genutzt wird, etc
Ein Inhaltsverzeichnis eines Buches braucht schließlich auch Papier und Tinte, und irgendwann findet man auch nix mehr in einem Index, wenn alle Informationen und nicht nur die Schlüsselwerte im diesem liegen ;)
 
Zurück