ThWboard Support-Forum (Archiv)

Ort: / Boardübersicht / Archiv / [fixed ?] Table -> tb_online ist zu gross!


Seite 1 von 1

Luki schrieb am 07.04.2004 um 11:57 Uhr

In der Tabelle tb_online werden doch eigentlich nur die User gespeichert, die aktuell online sind und zwar max. solange bis die Session abgelaufen ist.

Die Tabelle ist bei mir über 1MB gross und hat über 9000 Einträge!!
Die Einträge sind meistens doppelt und / oder 10fach! - d.h. nur die onlinetime ist anders. <- wieso wird hier nicht aktualisiert sondern ergänzt?

Wie darf ich das interpretieren?
siehe auch hier

if( time() % 60 > 55 )
{
    // delete some old records
    thwb_query("DELETE FROM ".$pref."online WHERE userid IN (0, ".$g_user['userid'].") AND onlinetime<" . (time() - $config['session_timeout']));
}

Nebenfrage:
if( time() % 60 > 55 )
^ Was heisst das Modulus, kann mir das jemand erklären?

theDon schrieb am 07.04.2004 um 19:22 Uhr

ich kümmer mich drum.

Luki schrieb am 08.04.2004 um 16:29 Uhr

danke - könntest du das bitte mit erhöhter Priorität bearbeiten, da das der einzige Bug ist der meinem Board wirklich Probleme macht!

theDon schrieb am 08.04.2004 um 19:26 Uhr

teste mal bitte den fix im cvs.

Luki schrieb am 08.04.2004 um 20:39 Uhr

im web-based cvs sind im augenblick noch keine Aktualisierungen, wahrscheinlich dauert das da länger, ich sag bescheid!

theDon schrieb am 08.04.2004 um 20:45 Uhr

jo, das wird nur alle 24h aktualisiert. besorg dir doch nen cvs client. ;)

Luki schrieb am 09.04.2004 um 01:12 Uhr

fix funzt leider noch nicht...
damit werden bei mir in der Online Liste nur ein Gast angezeigt... :/

theDon schrieb am 09.04.2004 um 01:18 Uhr

mh, ich guck nochmal.

Luki schrieb am 09.04.2004 um 01:28 Uhr

Danke! *helf gerne wo ich kann!*

theDon schrieb am 10.04.2004 um 17:19 Uhr

mkay, versuchs nochmal ;)

/e: die sache mit den session-ids sollte jetzt auch behoben sein ;)

Luki schrieb am 11.04.2004 um 17:38 Uhr

Cool Danke, gleich ein komplettes Session rewrite... =)

soviele Änderungen bei mir testen sind ziemlich risky!
wäre eigentlich schön, wenn wir das an diesem thwboard hier testen könnten!! :) - weil hier auch die Experten sitzen ;)
oder falls einige online sind auf Deinem TestBoard!

gestern hatten wir noch ein wenig Probs beim posten =ungültige SID auf dem Testboard ist das bereits mit gefixt?

theDon schrieb am 11.04.2004 um 20:06 Uhr

Luki postete
gestern hatten wir noch ein wenig Probs beim posten =ungültige SID auf dem Testboard ist das bereits mit gefixt?

das war jedenfalls vorm rewrite. ich habs mal in mein stufenboard gepackt, könnte aber ein weilchen dauern, bis da jemand reinguckt ;)

Luki schrieb am 06.05.2004 um 00:09 Uhr

aahhhrg 3 MB online_table

bitte bitte endlich vernünftiges Session Management entwickeln und auch das berücksichtigen: http://www.thwboard.de/forum/showtopic.php?threadid=5773

das ist wirklich ein riesen Problem .. was die gesamte THWB Entwicklung aufhält :(

mille schrieb am 08.05.2004 um 03:55 Uhr

Das Problem liegt an dem "Bugfix" von hier: http://www.thwboard.de/forum/showtopic.php?threadid=5567

Zumindest hab ich die Änderung gemacht und hatte dann inerhalb kürzester Zeit 300 Einträge, welche zum Teil über 3 Stunden alt waren.
Einfach ne sinnvolle Mischung aus alt und neu machen und anstatt:

if( time() % 60 > 55 )
{
// delete some old records

thwb_query("DELETE FROM ".$pref."online WHERE userid IN (0, ".$g_user['userid'].") AND onlinetime<" . (time() - $config['session_timeout']));
}

so nen Doppeldingens, bis die den Fehler in der andren MySQL-Anweisung da gefunden haben (hoffe, dass es einer ist und nicht wirklich beabsichtigt ;))

if( time() % 60 > 55 )
{
// delete some old records

thwb_query("DELETE FROM ".$pref."online WHERE userid IN (0, ".$g_user['userid'].") AND onlinetime<" . (time() - $config['session_timeout']));
thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - $config['session_timeout']));
}

Danach hast du wieder ne klitzekleine tb_online. ;)
Man könnte es sicher auch in eine Anweisung alles reinhauen... Normalerweise müsste ja sowieso - wenn man nur die obere nutzt - die tb_online platzen. Falls jetzt 10 User 55 Minuten lang richtig aktiv sind (in 55 Minuten bekommt man ne Menge Datensätze hin *g*) und dann nix mehr machen und Session-Timeout auf 3600 steht, dann hast du die Daten von denen halt durchgehend in der DB... rein theoretisch. Erst wenn dieser User wieder da is, kann er ja seien eignen Einträge löschen... nen andrer kann es ja net mehr.
Allerdings hatte ich irgendwie das Problem, dass selbst Einträge dieser User noch nicht mal nach den 60 min gelöscht wurden, sondern sie viel später immer noch drin standen - vielleicht auch verguckt. ;)

theDon schrieb am 08.05.2004 um 13:17 Uhr

normalerweise sollte es aber nicht mehr als ein eintrag pro user sein.

mille schrieb am 08.05.2004 um 13:22 Uhr

Ne, also da sind mehr als genug Einträge für einen User *g*

Hab immer so ca. 20 Stück für einen User =)
Aber so wie es aussieht, kann da Luki noch viel mehr bieten :D

Aber ich glaube, dass es schon immer so war da. Also auch in vorherigen Versionen, aber wirklich sicher bin ich mir da halt auch net. :/

Ich schau mal, ob ich durch Zufall nen Fehler in meiner header.inc.php finde. Vielleicht hab ich das auch einfach vermurkst irgendwann mal... aber weil Luki eben auch das Problem zu haben scheint :(


Ahh, ich hab mal ne dumme Frage (wieder mal *g*): Es wird doch automatisch nen Update der Session des User gemacht oder? Also kann ich da doch dieses -300 oder - config-timeout-blabla durch 10 oder so ersetzen?! Weil es gibt ja defintiv nen neuen Datensatz und der hat die Zeitdifferenz von 0 - also nahezu 0. Folglich müsste ich ja sowieso Gäste und User getrennt behandeln um ne saubere tb_online zu haben oder?
Na ich teste es mal bei mir...

Ach und falls mir noch jemand sagen könnte, ob ne Delete-Anfrage die bei jedem Seitenaufruf abgeschickt wird, die DB belastet, wäre ich euch echt dankbar ;) Also ich meine folgendes:

// delete some old records
if( time() % 60 > 55 )
{
  thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - $config['session_timeout'])." AND userid=0");
  thwb_query("UPDATE ".$pref."online SET sessionid=\"\" WHERE onlinetime<" . (time() - $config['session_timeout']));
};

thwb_query("DELETE FROM ".$pref."online WHERE userid=".$g_user['userid']);


// online

if(($g_user['userid'] != 0) && (!empty($s)))
{
  thwb_query("INSERT INTO ".$pref."online (onlineip, onlinetime, userid, sessionid)
    VALUES ('" . $HTTP_SERVER_VARS['REMOTE_ADDR'] . "', '" . time() . "', '" . $g_user['userid'] . "', '" . addslashes($s) ."');");
}
else
{
  thwb_query("INSERT INTO ".$pref."online (onlineip, onlinetime, userid)
    VALUES ('" . $HTTP_SERVER_VARS['REMOTE_ADDR'] . "', '" . time() . "', '" . $g_user['userid'] . "');");
}

Würde Gästen die Möglichkeit geben, dass ihre Session ne ganze Weile hält. Und einzelne User würden immer ihre alten Sessions selbst sofort löschen und anschließend sofort ihre Session da wieder reinhauen. Oder net gut, weil es durchgehend "DELETE" nutzt und von jedem User durchgehend genau eine Session gespeichert wird (wobei eben nach ner gewissen Zeit dann einfach nur die SID, aber net der Datensatz gelöscht wird ... muss auch bei logout.php so geändert werden)? Hätte den Vorteil, dass man dann die tb_online auch für eine "Last Seen"-Funktion nutzen könnte (läuft momentan auch ganz gut bei meinem kleinen Board...).
Wäre toll, wenn sich da theDon, MrNase oder irgendein andrer, der davon Ahnung hat, mal melden könnte die Tage. Gerade weil ich mir da überhaupt net sicher bin, ob ich da jetzt net ne Sicherheitslücke erschaffen habe durch die leeren SIDs?! Thx :)

theDon schrieb am 08.05.2004 um 23:40 Uhr

eigentlich läuft das so, dass, falls bereits ein passender eintrag existiert, da einfach die zeit aktualisiert wird.

Jürgen S. schrieb am 10.05.2004 um 08:09 Uhr

theDon postete
normalerweise sollte es aber nicht mehr als ein eintrag pro user sein.

Da unterliegst du einem Denkfehler.
So war es ja mal Originalscript

if( time() % 60 > 55 )
{
    // delete some old records
    thwb_query("DELETE FROM ".$pref."online WHERE onlinetime<" . (time() - 300));
}

Es wurde dann mal so geändert:

if( time() % 60 > 55 )
{
// delete some old records

thwb_query("DELETE FROM ".$pref."online WHERE userid IN (0, ".$g_user['userid'].") AND onlinetime<" . (time() - $config['session_timeout']));
}

Das Scriptteil :

(time() - 300)

erreicht ja, das alle Einträge die älter als 300 Milli?sekunden gelöscht werden.
die änderung auf

(time() - $config['session_timeout'])

erreicht, das die Einträge deutlich älter sein müssen, bevor sie gelöscht werden.
Ich denke nach wie vor, diese Variable sollte raus und es könnte ein eintrag so um die 10 bis 50 sein. Das sollte eigentlich reichen.
Zumal meine einträge in dieser Tabelle nur noch von mir selbst gelöscht werden. Vorher war es ja, das wenn die Bedingung von irgendeinem User erreicht wurde, alle einträge gelöscht werden.
Allerdings ist die Frage, warum die ganzen Einträge drinne bleiben, auch wenn der User sich ausloggt oder den Browser zu macht. Da sollten eigentlich die ganzen eigenen einträge spätenstens gelöscht werden.

mille schrieb am 10.05.2004 um 08:22 Uhr

Man kann auch einfach alle eignen löschen und dann wieder den neuen Eintrag setzen... wäre eigentlich besser von der Reihenfolge als es jetzt ist, oder? Dann fällt zumindest die unnötige Zeitdifferenz weg.

Kann mir noch einer die folgenden Fragen beantworten:

1. Datenzeile mit leerem SID-Feld ist doch ungefährlich oder?!
2. Was isn ansonsten im Allgemeinen mit meinem Vorschlag da oben? ^^ Also logout.php müsste man nur noch ein wenig anpassen, indem man da das DELETE durch nen UPDATE ersetzt und dann halt die last-seen-Funktion in die Memberliste... Hab des alles gemacht und es scheint gut zu laufen. Oder trügt der Schein? =)

theDon schrieb am 10.05.2004 um 17:18 Uhr

sollte jetzt im cvs gefixed sein.

Luki schrieb am 10.05.2004 um 17:22 Uhr

mmh @thedon sehr schade das du nicht auf meine PM antwortest...

wäre auf jeden Fall schön wenn du ein statement abgeben könntest, wie es mir dem Session System ausschaut, ob schon ein Cookie Check drin ist und wann ich es testen kann...

btw. fixt du eigentlich die Sachen die ich dir per PM sende, oder gehen die unter?????

theDon schrieb am 11.05.2004 um 20:21 Uhr

*hust* ja, das wird gefixed.

cookies sind noch nicht drin.du kannst aber zb einfach, falls ein gültiges cookie existiert, eine gültige sid `melden'. sollte kein großer aufwand sein, aber standard wirds wohl nicht.

Luki schrieb am 11.05.2004 um 21:42 Uhr

^^ wieso?

(kaum Aufwand, mehr Sicherheit, bessere Optik, viel weniger Traffic!)

Seite 1 von 1