PHP: onlinestatus
Micha
- php
Hallo an alle PHP experten,
ich hab folgendes problem:
Ich hab auf meiner seite eine memberliste, in der auch steht ob der user
gerade online (eingelogged) ist.
Ich hab das bisher so gemacht, dass wenn jemand sich eingelogged hat in die
mysql datenbank geschrieben wurde: online=yes - und wenn man dann wieder auf
logout geklickt hat, wurde yes in no umgeändert. Das funktioniert auch
alles ganz gut aber wenn sich jemand nich auslogged, wird er immernoch als
online angezeigt.
nun meine frage: wie geht das anders? also irgentwie mit nem cookie der sich
dann nach beenden der session wieder löscht...
so ich hoffe ich konnte mein problem halbwegs beschreiben und hoffe auf eure
antworten
DANKE
Hi,
ich hab folgendes problem:
Ich hab auf meiner seite eine memberliste, in der auch steht ob der user
gerade online (eingelogged) ist.
das ist in der Tat ein Problem; Du kannst es jedoch sehr leicht lösen, indem Du die Anzeige entfernst und somit Deine Besucher nicht anlügst.
nun meine frage: wie geht das anders?
Mit einem von HTTP unterschiedlichen, zustandsbehafteten, nicht verbindungslosen Protokoll; beispielsweise mit IRC. Innerhalb von HTTP existiert kein Weg.
Cheatah
Mit einem von HTTP unterschiedlichen, zustandsbehafteten, nicht verbindungslosen Protokoll; beispielsweise mit IRC. Innerhalb von HTTP existiert kein Weg.
Cheatah
Cheatah hat recht: Eine wirklich stimmige Anzeige wirst Du nicht hinbekommen.
Ansonsten wirst Du die letzte Aktion eines Benutzers festhalten müssen, diese in die Datenbank schreiben und bei der Abfrage festellen müssen, wie alt diese ist. Jetzt definierst Du ein maxAlter der letzten Aktion und vermutest, dass wenn dieses überschritten ist, der Benutzer weg ist, zählst Ihn also nicht mit.
Ein Cookie brauchst da nicht. Eine exakte Ausgabe ist aber auch nicht möglich. Aus Vermutungen können schließlich nur Vermutungen resultieren.
fastix
Also das versteh ich jetz nich!
es gibt doch 1000 seiten, die ein onlinestatus haben!
Also muss das ja nich so schwer sein oder?
mfg micha
Hi,
Also das versteh ich jetz nich!
es gibt doch 1000 seiten, die ein onlinestatus haben!
Und die betrügen einen genauso (und wissen es meistens nicht mal, dass sie betrügen, weil sie das Konzept nicht kapiert haben) ....
Also muss das ja nich so schwer sein oder?
Lies Dir mal durch, was Cheatah gesagt hat:
Mit einem von HTTP unterschiedlichen, zustandsbehafteten, nicht verbindungslosen Protokoll; beispielsweise mit IRC. Innerhalb von HTTP existiert kein Weg.
Also: Sorge dafür, dass sich Deine Freunde und Du immer in einen IRC-Server einloggen, sobald Ihr Online seid und checke dann, ob der Nickname vorhanden ist oder nicht. Anders geht es _nicht_ (zumindest nicht richtig).
Grüße,
Christian
Also:
ich benutze PHP und ich weiß nich was ich da mit nem irc server soll?
mfg micha
Hi,
ich benutze PHP und ich weiß nich was ich da mit nem irc server soll?
PHP bringt Dir da auch wenig. Clientseitig muss der Login erfolgen; beispielsweise über ein Java-Applet. Anschließend kannst Du serverseitig eine Anzahl ermitteln.
Das alles kannst Du Dir aber auch sparen, wenn Du Dir bewusst machst, dass die Nennung einer solchen Zahl _niemandem_ etwas bringt. Weder Dir noch Deinem User, egal ob die Zahl reell, gelogen und/oder durch einen Zufallsgenerator ermittelt worden ist (was vermutlich die einfachste Methode ist und auch keine "schlechteren" Ergebnisse erzielt).
Cheatah
Hi cheatah,
also der login erfolgt über session_start()!
So und wenn der benutzer dann eingelogged hat wird der online auf "yes" gesetzt (in der mysql datenbank). So und wenn er dann wieder auf logout klickt, setzt ich dann online wieder auf "no"!
und ich weiß nich was daran gelogen oder durch zufall ausgewählt is!
es liegt nur daran, dass sich der user wieder ausloggen muss!
mfg micha
Hi,
also der login erfolgt über session_start()!
na und?
So und wenn der benutzer dann eingelogged hat wird der online auf "yes" gesetzt (in der mysql datenbank). So und wenn er dann wieder auf logout klickt, setzt ich dann online wieder auf "no"!
Und wenn er nicht drauf klickt? Woher weißt Du, _dass_ er nicht draufgeklickt hat; bzw. wie willst Du "hat nicht geklickt" und "klickt vielleicht noch" unterscheiden?
Du kannst - wie viele, viele, _viele_ vor Dir![1] - ewig weiter diskutieren, oder es einsehen, *dass* *es* *nicht* *geht*, denn das ist Tatsache. Per HTTP hast Du nicht die geringste Chance, denn HTTP ist verbindungs- und zustandslos - es hat nicht mal eine Definition für "User", geschweige denn für "derzeit". Selbst über "online" kann man streiten.
und ich weiß nich was daran gelogen oder durch zufall ausgewählt is!
Das ist schade, aber vermutlich wird Dein Verständnis für die von Dir eingesetzten Techniken noch reifen.
Cheatah
[1] Vergleiche Forums-Archiv.
ok ich sehe es ein!
ende der diskusion!
danke für eure antworten
gruß micha
[geht mal auf meine homepage]
"es liegt nur daran, dass sich der user wieder ausloggen muss!"
Und ganz genau deswegen wird es so nicht gehen und Du kannst nur vermuten. Ansonsten wächst Deine Zahl irgenwann in das unermessliche.
Les den Thread jetzt noch einmal in Ruhe durch, lasse es bleiben, wie Cheatah es emphielt oder mache es so wie ich es vorgeschlagen habe, aber fülle das Forum nicht mit Deinem naiv-trotzigem "Ich will". Was nicht geht, dass geht nicht. Vielleicht solltest Du einfach einmal bereit sein etwas zu lernen. Von Cheatah zum Beispiel- der weiss sehr viel über HTTP, PHP, HTML, Webserver und so weiter.
fertig.
fastix
Also Micha! Das ist doch nicht schwer. Statt des Status "online" trägst Du den Timestamp ein. Dann lässt Du Dir von Mysql alle ausgeben, deren Timestamp größer als der aktuelle Timestamp minus X ist.
Mit X kannst Du dann ein wenig steuern: Ein großes X gibt Dir eine Zahl an die größer ist als die Aktuelle Anzahl der aktiven User, ist Dein X zu klein ist die Anzahl auch zu klein.
Alle diese Seiten veröffentlichen "Schätzungen", bei einigen hat man den Eindruck es handelt sich um Zufallszahlen.
Diue Funktion heisst übrigens time() und gibt die aktuelle Anzahl der Sekunden seit dem 1.1.70 00:00 in sekunden zurück.
Du brauchst also in Deiner DB ein Zahlenfeld für große Integer- Zahlen.
fastix
Hallo Micha,
die Sache mit dem Timestamp ist Dein Freund. Da kannst Du dann nämlich sogar die User erfassen, die sich gar nicht autentifiziert haben (unter "Anonym").
Wen eine Auth stattgefunden hat, dann wird bei jedem Zugriff auf eine Seite in der Logged-Tabelle der Datensatz aktualisiert. d.h. der Timestamp für die Userkennung neu gesetzt. Da User, auch wenn sie "passiv" sind, siche mal klicken, passiert das innerhalb eines angemessenen Zeitrahmens. Als angemessen würde ich so ca. 30-60 Sekunden bezeichnen. Man kann sogar soweit gehen, dass man das abstuft:
< 30 Sekunden -> schwarzer Link auf den User
< 60 Sekunden -> dunkelgrauer Link auf den User
< 180 Sekunden -> hellgrauer Link auf den User
< 600 Sekunden -> "eingeschlafen..."
und danach rausschmiss aus der Liste.
Die ganze Diskussion um "Belügen" ist eine rein akademische. Wann bist Du denn auf einer Party "anwesend"? Wenn man dich die letzen 2 Minuten irgendwo gesehen hat?
Durch die Art der Abstufung wird Dein Server übrigens nur unwesentlich mehr belastet. Das Script (oder der teil davon) für die Timestamp-Funktion ist derartig schnell durch, dass Du auf einem "normalen" PC (700er Athlon, nur IDE-Platte, 256MB) ungefähr 12.000 Seitenaufrufe (also das Script) pro Sekunde bedienen könntest. Dazu kommt natürlich dann die Last des Nutzinhalts.
Ohne Nutzinhalt könnte Dein Server dann aber bei einer mittleren Klickrate von 1 mal pro 30 Sekunden 36.000 "gleichzeitige" Benutzer bedienen. Ich wär schon froh, wenn ich 36 (gleichzeitige) hätte.
Grüße aus Braunschweig
Tom
Hi,
die Sache mit dem Timestamp ist Dein Freund. Da kannst Du dann nämlich sogar die User erfassen, die sich gar nicht autentifiziert haben (unter "Anonym").
und was nützt Dir das? Du bewegst Dich noch immer in HTTP, und mit diesem Protokoll *ist* *es* *einfach* *nicht* *möglich*. Geht nicht. No way. Keine Chance. Niemals. Vollkommen unmöglich. Und wer es immer noch nicht glauben will: "Funzt net."
Cheatah
Guten Abend Cheatah,
und was nützt Dir das? Du bewegst Dich noch immer in HTTP, und mit diesem Protokoll *ist* *es* *einfach* *nicht* *möglich*. Geht nicht. No way. Keine Chance. Niemals. Vollkommen unmöglich. Und wer es immer noch nicht glauben will: "Funzt net."
Deshalb muss man sich doch nicht aufregen...
Was heißt denn Online z.B. bezogen auf ein Forum? Das bedeutet doch, dass ich Deine Antwort jetzt gelssen habe und Du durchaus innerhalb der nächsten 30-60 Sekunden auf eine von mir hoffen kannst, oder von mir aus auch: sie befürchten musst ;-)
Wenn mein Link dann aber schon "eingeschlafen..." zeigt, dann schau mal lieber morgen früh wieder nach.
Mehr wollen die User doch gegenseitig nicht voneinander wissen. Hier geht es also nicht um eine eins zu eins Abbildung des netzwerkprotokolls sondern um eine praktische und informative Umsetzung des Userverhaltens.
Da HTTP grundsätzlich so funktioniert wie auch SQL, kann keiner erwarten, dass er was davon mitbekommt, wenn die Änderung der unilokalen Originaldaten erst 1Millionstel Sekunde NACH der Antwort auf seinem Request stattfindet. Wir arbeiten eben nicht mit ServerPush sondern mit Polling.
Grüße
Chris
Hi,
Deshalb muss man sich doch nicht aufregen...
ich rege mich höchstens darüber auf, dass ein und die selbe - sinnfreie - Diskussion immer und immer wieder angefangen und leider trotz allem was man versucht, trotz aller Fakten stets bis zum Erbrechen von Leuten weitergeführt wird, die oft nicht mal den Unterschied zwischen HTML und HTTP kennen.
Was heißt denn Online z.B. bezogen auf ein Forum?
Ob Forum oder nicht sei mal dahingestellt. Der HTTP-Server kriegt nur mit, dass ein Client etwas angefordert hat. Wenn er die Antwort schickt weiß er nicht mal mit Sicherheit, dass der Client überhaupt noch da ist, mal ganz abgesehen davon dass er keine Ahnung davon hat, ob überhaupt ein "jemand" dahintersteckt. Wie soll er dann einen "User-Zähler" erhöhen können?
Das bedeutet doch, dass ich Deine Antwort jetzt gelssen habe
Nein, bedeutet es nicht. Das ist eines der Probleme, weshalb es in HTTP _nicht_ _geht_ und niemals gehen _kann_.
Hier geht es also nicht um eine eins zu eins Abbildung des netzwerkprotokolls sondern um eine praktische und informative Umsetzung des Userverhaltens.
Du scheinst nicht zu sehen, dass das eine das andere braucht.
Da HTTP grundsätzlich so funktioniert wie auch SQL,
Wie bitte, was? SQL ist zunächst einmal eine Sprache, kein Protokoll. Abgesehen davon ist eine Verbindung zur Datenbank jedoch durchaus beständig, im Gegensatz zu einer in HTTP - die existiert _spätestens_ dann nicht mehr, wenn der Server seine Antwort losgejagt hat.
Wir arbeiten eben nicht mit ServerPush sondern mit Polling.
Wir arbeiten vor allem verbindungs- und zustandslos.
Cheatah
Hi,
Deshalb muss man sich doch nicht aufregen...
ich rege mich höchstens darüber auf, dass ein und die selbe - sinnfreie - Diskussion immer und immer wieder angefangen und leider trotz allem was man versucht, trotz aller Fakten stets bis zum Erbrechen von Leuten weitergeführt wird, die oft nicht mal den Unterschied zwischen HTML und HTTP kennen.
Wieso, gibts da einen?
Was heißt denn Online z.B. bezogen auf ein Forum?
Ob Forum oder nicht sei mal dahingestellt. Der HTTP-Server kriegt nur mit, dass ein Client etwas angefordert hat. Wenn er die Antwort schickt weiß er nicht mal mit Sicherheit, dass der Client überhaupt noch da ist, mal ganz abgesehen davon dass er keine Ahnung davon hat, ob überhaupt ein "jemand" dahintersteckt. Wie soll er dann einen "User-Zähler" erhöhen können?
na, einfach mit SUM oder COUNT ... WHERE ... , oder?
Das bedeutet doch, dass ich Deine Antwort jetzt gelesen habe
Nein, bedeutet es nicht. Das ist eines der Probleme, weshalb es in HTTP _nicht_ _geht_ und niemals gehen _kann_.
Doch, das bedeutet, ich bin "Online", wenn ich in einer angemessenen Zeit ragiere. Darum gehts ja hier, dass nicht der Begriff ONLINE aus der Hardware sondern der aus der Software-Ergonomie benutzt wird. Das können natürlich nur Leute verstehen, die aufgeschlossen sind für die meinung Anderer - also keine CDU-Wähler.
Hier geht es also nicht um eine eins zu eins Abbildung des Netzwerkprotokolls sondern um eine praktische und informative Umsetzung des Userverhaltens.
Du scheinst nicht zu sehen, dass das eine das andere braucht.
Nö, wieso braucht ein User ein Netzwerkprotokoll. Applikationen arbeiten doch völlig losgelöst von der Funktionsweise der unteren Schichten. Was geht mich da das Protokoll an? Ob das nun "da unten" verbindungslos oder verbindungsbezogen ist, ist für das Verhalten des Users und die dafür zu entwickelnde Applikation vollkommen unerheblich. Es kommt nur darauf an, dass die Applikation so nah wie möglich die Bedürfnisse des Users trifft.
Da HTTP grundsätzlich so funktioniert wie auch SQL,
Wie bitte, was? SQL ist zunächst einmal eine Sprache, kein Protokoll. Abgesehen davon ist eine Verbindung zur Datenbank jedoch durchaus beständig, im Gegensatz zu einer in HTTP - die existiert _spätestens_ dann nicht mehr, wenn der Server seine Antwort losgejagt hat.
Auf der Schicht, auf der Du dich bewegst, weiß der Server gar nichts. Er bekommt einen Stapel von Bits, die werden (vielleicht) zu einer Anfrage zusammenmontiert. Dann reicht er die an die Applikation weiter. Die antwortet in einen Buffer, wenn sie kann, der Server holt die Daten aus dem Buffer und fragmentiert sie in der entsprechenden Schicht wieder und wshcikt sie auf die Leitung.
Und selbstverständlich funktioniert die SQL-Technologie genau nach dem Prinzip Frage und Antwort und nicht nach dem Prinzip: "ich (Server) hätte da was, was ich doch vielelicht mal an Client 37 schicken könnte. Mal sehen, ob der sich dafür interessiert..."
Wir arbeiten eben nicht mit ServerPush sondern mit Polling.
Wir arbeiten vor allem verbindungs- und zustandslos.
Aber bitte nicht kopflos...
Cheatah
He Leuts!
Die Diskussion ist akademisch.
Einigen wir uns darauf, dass das Ergebnis der Berechnung eine Schätzung ist, die dem Autor der Webseite und seinem Publikum genügen dürfte.
Es ist immerhin noch besser eine gute Schätzung zu bekommen als gar keine Zahlen zu haben. Und dazu taugt das Instrument hinreichend gut genug. Ich denke die Fehlerqoute ist, ausreichend Traffic auf der Seite vorausgesetzt gar nicht mal so hoch, wenn die Parameter mit den statistischen Werten (Welche Zeit vergeht, bis ein Besucher nochmals klickt?) vernünftig abgeglichen werden.
Cheatah hat von der Theorie her recht. Chris von der Praxis.
Also ich sehe in der Angabe nichts verwerfliches.
fastix
Hi fastix,
na vielen Dank für die Einschätzung.
Hier gings ja nur um die Praxis und nicht darum, sich an Buchstaben der Theorie aufzugeilen. Im Übrigen wird auch bei den verbindungsbehafteten Protokollen eine Quantisierung vorgenommen. Das ist der sogenannte Network Heartbeat. In einem Novell-Netzwerk (verbindungsbezogen aufgebaut) kann es durchaus eine Minute dauern, bis der Server merkt, dass sein Client schlapp gemacht hat.
Wie komm ich eigentlich an Dein CodeGen und was kann ich damit machen?
LG
Chris
Wie komm ich eigentlich an Dein CodeGen und was kann ich damit machen?
Der ist nicht von mir. CodeGen ist ein Programm, welches HTML- Code für etliche Anwendungsfälle erzeugt.
Ich habe es auch noch nicht probiert. Leider ist es kein Plug- In für Phase 5 :)
fastix
moin,
wäre es nicht möglich, dass du deinen seite in einem frame laufen lässt, der eine unsichtbare seite enthält, in der eine js-funktion beim verlassen der seite ein "submit" ausführt, welches dann den logout bewirkt?
war nur so eine idee
gruß Oppa
Hi,
war nur so eine idee
die die Fehlerrate auch nicht wesentlich reduziert. Jemand kann einfach offline gehen (oder rausfliegen, Browser stürzt ab...), dann nützt das ganze auch nichts mehr.
Übrigens ist diese Idee ebenfalls bereits beliebig oft verworfen worden. Bevor irgendjemand eine "neue" Idee entwickelt - die ebenfalls verworfen werden wird, weil es in HTTP eben technisch unmöglich ist - recherchiert doch *bitte* im Forums-Archiv.
Cheatah