Aufrufe-"Zähler" für Webseite programmieren?

Dashboard - wenn Besuch auf Homeseite dort +1 - (Computer, Webseite, programmieren)

5 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Ich würde eine Datenbank (z.B. MySQL/MariaDB) nutzen und von TXT-Dateien abraten.


TeeTier  31.07.2017, 00:29

Volle Zustimmung! Alles andere wäre potentiell unsicher! (siehe dazu meine Antwort / meinen Rant) :)

0
HamsterKnowHow 
Beitragsersteller
 30.07.2017, 23:31

Ja gut DB kann ich machen und was muss ich dann schreiben fürn Code?

0
tavkomann  30.07.2017, 23:39
@HamsterKnowHow

Folgende Tabelle würde ich empfehlen:

CREATE TABLE counter (
    count INT DEFAULT NULL
);


Eintragen:

UPDATE counter
SET count = count + 1;


Auslesen:

SELECT count FROM counter;
0
tavkomann  31.07.2017, 20:48
@tavkomann

Die Tabelle sieht so aus:

CREATE TABLE counter (
count INT DEFAULT NULL
);


PHP:

<?php

$db = new mysqli("localhost", "user", "pass", "db");
if ($db->connect_errno)
   die('Verbindungsfehler');

$stmt = 'UPDATE counter SET count = count + 1';
$db->query($stmt)
   OR die('Fehler');

$stmt = 'SELECT count FROM counter';
if (!$result = $db->query($stmt))
   die('Fehler');

$db->close();

echo $result->fetch_array()[0] . ' Aufrufe';

?>
1

Ich würde es spontan wie folgt angehen, wobei die Methode, da du keine IPs speichern möchtest, beim Bereinigen des Browser-Caches obsolet ist.

1) schreibe eine Funktion, die den Wert deines Datenbankeintrages für den Counter um den Wert 1 erhöht

2) schreibe eine Funktion zum Setzen eines LocalStorage Eintrages und führe darin auch die Counter-Funktion aus

3) überprüfe, ob der localStorage Eintrag beim Nutzer vorhanden ist. Wenn nicht, dann führe deine Funktion zum Setzen des Eintrages aus. Dabei wird, wie oben ja gesetzt, auch der Datenbankeintrag des Counters um 1 erhöht.

Und falls der Eintrag vorhanden ist, wird die Counter-Funktion ja auch nicht ausgeführt.

Eine einmaligere Variante wäre, wenn du z.B. über einen dieser gelisteten Dienste (https://stackoverflow.com/questions/391979/how-to-get-clients-ip-address-using-javascript-only) die IP ermittelst und als Array in deiner Datenbank speicherst. Statt wie in Schritt 3) zu überprüfen, ob ein localStorage Eintrag vorhanden ist, würdest du prüfen, ob die IP des Nutzers in deinem Array ist und falls er das ist, wird der Counter nicht ausgeführt und falls doch, wird statt eines localStorage Eintrages die IP dem Array hinzugefügt.

Mit dieser Methode solltest du jedoch ein über den localStorage gesetztes "Cookiefenster" erstellen, in dem du sagst, dass du die IP speicherst und erwähne es auch in deiner aus dem Internet generierten Datenschutzerklärung.

Dein Stichwort ist nicht "Visitor-Counter" sondern "Hit-Counter". Frag mal Google danach (am besten ohne Bindestrich), dort findest du genügend!

Disclaimer: Ohne Datenbank ist ein Hit-Counter in PHP erstaunlicherweise nur sehr buggy zu realisieren, einfach weil PHP die benötigten Synchronisationsmöglichkeiten fehlen.

Die Fehler, mit denen du beim Zählen in einer Textdatei rechnen musst, sind a) Datenverlust, b) Dateninkonsistenz, c) Blockaden bei Requests oder d) sogar richtige Deadlocks, die sich nur durch einen Neustart des Servers beheben lassen. (Mit anderen Worten: Durch Ausnutzung von Punkt "d" lässt sich sehr komfortabel ein DoS-Angriff gegen deinen Server realisieren!)

Die angeführten Punkte treten vor allem bei hochfrequentierten Servern auf, aber da es eigentlich nur auf das Timing und die Server- bzw. PHP-Konfiguration ankommt, muss man eigentlich immer damit rechnen. Ein Kumpel von mir hat mir das oben Beschriebene Szenario nicht geglaubt, und meinte, dass dieses Verhalten so gut wie nie auftreten wird. Leider hat er übersehen, dass man so gut wie jedes "seltene Verhalten" provozieren kann, und zur Demonstration habe ich 2 Minuten gebraucht, bis sein Server "eingefrohren" war und sich nichts mehr rührte.

Die genauen Gründe habe ich schon an anderer Stelle bei früheren und ähnlich gelagerten Fragen genauestens erläutert, und es würde jetzt hier den Rahmen sprengen, nochmal alles zu wiederholen.

Fakt ist, dass PHP äußerst ungeeignet ist, um damit Textdateien als Datencontainer zu benutzen. Die Sprache und die Standardbibliothek haben einfach viel zu viele Inkonsistenzen, um einen Fehlerfreien Betrieb zu gewährleisten. (Das wissen viele PHPler schlicht weg nicht und selbst in Fachbüchern wird nicht [ausreichend] darauf hingewiesen!)

Deshalb solltest du diesen Mangel an PHP unbedingt mit einer Datenbank ausgleichen, denn im Gegensatz zu PHP selbst, sind die gängigen SQL-Systeme darauf ausgelegt, mit parallelen Anfragen umgehen zu können. Unglaublich, aber wahr, PHP ist nur für Single-Thread-Ausführung verlässlich nutzbar und eigentlich völlig ungeeignet im Serverbetrieb.

Dateiinhalte mit file_get_contents(), file_put_contents() oder wahlweise mit fopen(), flock(), fread(), fwrite() und fclose() zu bearbeiten WIRD irgendwann schiefgehen MÜSSEN, aufgrund des Sprachdesigns von PHP. Aber um das zu verstehen fehlt es 99% aller PHP-Entwickler an Überblick.

(Für Systementwickler hingegen ist die Sache klar, aber die kennen sich auch mit SysV-IPC aus, und wissen wo der Unterschied bei einem File-Descriptor und einer File-Description liegt ... und genau DAS sind die drei Punkte, deren Zusammenspiel die PHP-Entwickler übersehen haben und welche die oben erwähnten Fehler verursachen. Aber egal, das würde jetzt - wie gesagt - den Rahmen sprengen!)

tl;dr

Nimm AUF JEDEN FALL eine Datenbank! Vermutlich ist MySQL die Datenbank erster Wahl für deinen Fall.

Viel Erfolg mit deinem Hitcounter!

PS: Google einfach mal nach "php mysql hit counter". ;)


StrangeMale  31.07.2017, 20:15

TeeTier ist einfach der beste und weiss auf alle IT Fragen Rat, danke

1
barnim  31.07.2017, 01:26

Man möchte vermeiden, Dinge wie User Statistiken oder auch Log Zeug in eine MySQL Datenbank zu werfen. Wenn eine Website anfängt richtig benutzt zu werden, kann einem sowas viel Performance kaputt machen. Ein InfluxDB oder Graphite sind hier die (viel) besseren Tools.

0
HamsterKnowHow 
Beitragsersteller
 31.07.2017, 00:46

Danke, aber aus den Anleitungen werde ich trotzdem nicht schlau.

<?php

session_start();
include_once("db.php");

// gets the user IP Address
$user_ip=$_SERVER['REMOTE_ADDR'];

$check_ip = mysql_query("select userip from pageview where page='yourpage' and userip='$user_ip'");
if(mysql_num_rows($check_ip)>=1)
{

}
else
{
$insertview = mysql_query("insert into pageview values('','yourpage','$user_ip')");
$updateview = mysql_query("update totalview set totalvisit = totalvisit+1 where page='yourpage' ");
}
?>

Habe ich mal laut Anleitung gemacht, klappt aber nicht. Wieso, kannst du mir da helfen? .-.

0
tavkomann  31.07.2017, 20:34
@HamsterKnowHow

Sag mal, wie alt ist die Anleitung? Die MySQL-Extension ist längst veraltet und zusätzlich besteht die Gefahr der SQL-Injection. Ich ergänze gleich mal meine Antwort.

0

Ich würde dir ja gerne weiterhelfen, aber es werden dann Leute kommen die mein Beitrag schlecht machen obwohl die selber kaum Ahnung haben.

Aber wenn du dein Vorhaben nicht mittels einer .txt Datei umsetzen möchtest, kommst du an einer Datenbank wohl kaum vorbei, also wenn du deine Webseite mit Apache betreibst.


abbrechen  31.07.2017, 20:02

Wenn ich auf gf.net jedes Mal nichts schreiben würde, wenn die Gefahr bestünde, dass jemand meine Antwort anprangern wird, hätte ich 600 Antworten weniger auf dem Buckel.

Damit musst du immer rechnen, aber lasse dich davon nicht unter kriegen. =)

0
HamsterKnowHow 
Beitragsersteller
 30.07.2017, 23:55

Wieso sollten sie es schlecht machen?

Ich habe einen Webspace, Datenbank wäre kein Problem. 

0

Na, die Zähler (Counter) gibt es im Web kostenlos und teils in sehr netter Form. Google mal