Seiten-Counter verbraucht zuviel Performance?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Maxi
Mitglied
Beiträge: 252
Registriert: 09.11.2003 20:01

Seiten-Counter verbraucht zuviel Performance?

Beitrag von Maxi »

Ich hab bei mir neben einem besuchercounter auch noch einen Seiten-Counter in den PageHeader eingebaut. Praktisch bei jedem Seitaufruf wird dabei ein Datensatz in der Datenbank geupdatet.
Ich habe aber das Gefühl das dies zuviel Performance verbraucht, vermutlich wegen Locking in der Datenbank (nehme an da sgeht automatisch).
Wie kann man SeitenCounter mit wenige rPerformance-Verlust realisieren. Gibts da Tricks?

Gruß
Frank
Benutzeravatar
MrMind
Mitglied
Beiträge: 464
Registriert: 29.11.2003 17:14
Wohnort: Darmstadt/Odw
Kontaktdaten:

Beitrag von MrMind »

Im Prinzip hängt es an der Art wie man den Seitencounter gecodet hat. Mehr Performance beringt vorallem auch, weniger SQL-Abfragen machen und soviel wie möglich zusammenfassen.

Haste mal versucht den Seitencounter mal mit TXT-Datein zu coden, anstatt auf MySQL basis???


Mfg
MrMind
Selbst ist der Coder
Coder unter Linux
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Beitrag von D@ve »

Wieviel Millionen Benutzer hast Du denn am Tag? Damit man mit einem Query pro Aufruf Performanceprobleme bekommst muss man schon ziemlich viele User haben...
Poste mal den Teil Deines Counter Scriptes mit dem Query. Hast Du da vielleicht irgendwo ne Schleife eingbaut, die etwas länger läuft als Du glaubst?

Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Gast

Beitrag von Gast »

Der Counter ist wie gesagt auf jeder generierten Seite, da er im PageHeader steckt. Der COde ist recht einfach:

Code: Alles auswählen

$sql = "UPDATE " . CONFIG_TABLE . "SET config_value = '" . ($test_counter + 1) . "' WHERE config_name = 'test_counter'";
[code]

Aber diese Anweisung wird halt sehr oft aufgerufen, ich hab ca. 300 Besucher am Tag die schätzungsweise zusammen 3000-5000 Seiten abrufen. Ich denke da kommt es auch mal vor das gerade gleichzeitig User die Zeite wechseln, vielleicht gibt es da ein Locking Problem?
Ich hab jedenfalls das Gefühl die Abfrage reduziert Performance. Habt ihr ne bessere Lösung?
Ich denke ne Textdatei ist noch schlechter, vor allem wegen dem Locking.
Gast

Beitrag von Gast »

Der Counter ist wie gesagt auf jeder generierten Seite, da er im PageHeader steckt. Der COde ist recht einfach:

Code: Alles auswählen

$sql = "UPDATE " . CONFIG_TABLE . "SET config_value = '" . ($test_counter + 1) . "' WHERE config_name = 'test_counter'";
[code]

Aber diese Anweisung wird halt sehr oft aufgerufen, ich hab ca. 300 Besucher am Tag die schätzungsweise zusammen 3000-5000 Seiten abrufen. Ich denke da kommt es auch mal vor das gerade gleichzeitig User die Zeite wechseln, vielleicht gibt es da ein Locking Problem?
Ich hab jedenfalls das Gefühl die Abfrage reduziert Performance. Habt ihr ne bessere Lösung?
Ich denke ne Textdatei ist noch schlechter, vor allem wegen dem Locking.
Maxi
Mitglied
Beiträge: 252
Registriert: 09.11.2003 20:01

Beitrag von Maxi »

Sorry wegen Doppelposting! War leider versehendlich nicht eingelogt
Benutzeravatar
D@ve
Ehemaliges Teammitglied
Beiträge: 3842
Registriert: 28.08.2002 19:33
Wohnort: Bretzfeld
Kontaktdaten:

Beitrag von D@ve »

Anonymous hat geschrieben:Der Counter ist wie gesagt auf jeder generierten Seite, da er im PageHeader steckt. Der COde ist recht einfach:

Code: Alles auswählen

$sql = "UPDATE " . CONFIG_TABLE . "SET config_value = '" . ($test_counter + 1) . "' WHERE config_name = 'test_counter'";
[code]

Aber diese Anweisung wird halt sehr oft aufgerufen, ich hab ca. 300 Besucher am Tag die schätzungsweise zusammen 3000-5000 Seiten abrufen. Ich denke da kommt es auch mal vor das gerade gleichzeitig User die Zeite wechseln, vielleicht gibt es da ein Locking Problem?
Ich hab jedenfalls das Gefühl die Abfrage reduziert Performance. Habt ihr ne bessere Lösung?
Ich denke ne Textdatei ist noch schlechter, vor allem wegen dem Locking.[/quote]

300 User sind noch nicht wirklich viel... Ich hab ähnlichen Traffic auf meine Seite und in meinem (selbstgebastelten) Counter-Script (auch auf jeder Artikelseite im CMS) sind 4 Queries...

Läuft php bei Deinem Server eventuel als CGI?

Gruß, Dave
There are only 10 types of people in the world: Those who understand binary, and those who don't
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Scheinbar liest du den Wert zuerst aus der Datenbank, veränderst ihn dann in PHP und schreibst ihn wieder in die Datenbank. Besser ist da

Code: Alles auswählen

UPDATE tabelle SET feld=feld+1 WHERE foo=bar
Ausserdem bringt dein Vorgehen folgendes Problem:
  1. Prozess A liest den Wert aus: 5
  2. Prozess A erhöht um 1: 6
  3. Prozess B liest den Wert aus: 5
  4. Prozess A schreibt in Datenbank: 6
  5. Prozess B erhöht um 1: 6
  6. Prozess B schreibt in Datenbank: 6
Dann wurde der Zähler um 1 erhöht, obwohl 2 Zugriffe stattgefunden haben. Bei einem SQL Befehl regelt das die Datenbank (man könnte auch Transaktionen verwenden, für sowas wie das Hochzählen eines einzelnen Werte ist das allerdings übertrieben)
Maxi
Mitglied
Beiträge: 252
Registriert: 09.11.2003 20:01

Beitrag von Maxi »

Na ich lese es nicht direkt nochmal aus und erhöhe es dann, sondern es wird eh vorher im Script irgendwo ausgelesen. Da steht vorher der Befehl:

$visit_counter = $board_config['test_counter'];


Meint ihr das bringt was wenn ich das weglasse und statt dessen nur

UPDATE tabelle SET feld=feld+1 WHERE foo=bar

nehme.
Dumme Frage: Was bdeutet " foo=bar". Das muß doch so heißen:

UPDATE tabelle SET feld=feld+1 WHERE config_name = 'test_counter'";

Oder?
Maxi
Mitglied
Beiträge: 252
Registriert: 09.11.2003 20:01

Beitrag von Maxi »

Nachtragen:

Und wenn ich nu die Abfrage :
UPDATE tabelle SET feld=feld+1 WHERE config_name = 'test_counter'";

zum aktuallisieren nehme, dann brauch ich ja imme rnoch ne Abfrage um den Wert rauszulesen. Ich muß ihn ja schließlich auch anzeigen. Damit dürfte es nicht viel Performance bringen, oder? Nur halt genauer zählen!
Antworten

Zurück zu „Coding & Technik“