Upadte zum Offline-Status wird nur bei Google Chrome ausgeführt

  • Hey,


    ich baue grad ein Chat und möchte anzeigen lassen ob die User online, offline sind oder etwas schreiben. Dies funktioniert auch soweit. Dafür lasse ich bei Events HTTP-Requests ausführen. In der PHP-Datei führe ich dann die Überprüfung und das Update aus.


    Mit den Anzeige online und schreiben funktioniert alles ohne Probleme, auch beim Firefox. Die Anzeige, bzw. das Update vom Logout wird nur beim Google Chrome ausgeführt und nicht beim Firefox. Ich weiß nicht warum. Desweiteren ist es ja so, dass wenn ein Chatuser den Browser komplett schließt, dass dann die Session zerstört wird und nicht mehr existiert. Es wird aber nie richtig erkannt. Der User bleibt dann trotzdessen online, was ich auch nicht verstehen kann, weil ich explizit im Code darauf überprüfe.


    Hier sind die Codes:

    Code: Ausloggen
    <header class="container">
            <h1 class="text-center mb-5">Chat</h1>
            <ul>
                <li><a href='?aktion=ausloggen' id='logout'>Ausloggen</a></li>
            </ul>
        </header>


    Ich hoffe ihr könnt mir dabei helfen und erklären.


    Grüße,

    Stef

  • Ohne ein preventDefault() oder stopPropagation() wird die Standard-Aktion ausgeführt und die basiert beim Klick halt auf dem href, erzeugt also einen neuen Request. Ich könnte mir vorstellen, dass es damit zu tun hat, denn Browser verhalten sich schon mal unterschiedlich.

  • Ich komme bei meinen Chat auch nicht weiter . Bzw bedingt . Ob ein user online offline afk oder am tippen ist das kann ich mitlerweile alles anzeigen lassen .


    Doch wenn ein user den Chat über den Browser fenster schliesen verläst bleibt er trotzfrm Online .Ich merk das ja selber das meine php session noch läuft .


    Wie kann man den auslesen ob ein User den Browser geschlossen hat.

    Habe es mit diesen event versucht

    Code
    $(window).on("beforeunload", function() { 
    alert('Und schüss');
    })

    aber das klappt irgendwie nicht .

    Wie kann ich den noch rausfinden ob der User überhaupt noch das browserfenster auf hat bzw wenn es auf ist und er es schliest .

  • Hey,


    okay. Ich habe nun ein Logoutformular erstellt und führe dann bei click auf den Button ein Request aus. Das Problem dabei ist, dass wenn ich die Response an eine andere Datei sende, null rauskommt. Wenn ich jedoch die Response zur chat.php (Hauptseite) sende, dann ist es vorhanden.


    Bei dem besteht aber das Problem, dass im responseText ja die ganze Ausgabe des Scripts chat.php enthalten ist. Das heißt nicht nur mein gewünschtes sondern auch der ganze HTML-Quellcode. Nun funktioniert jede Abfrage auf $_POST['aktion'] == logout nicht, da meiner Meinung nach die ganze Response ein Teil ist und ich es erst zurecht splitten muss. Daran scheitere ich.


    Meine Idee war es, die Daten an eine, nur php-datei, zu senden aber da kommt wie gesagt nichts an, was ich nicht nachvollziehen kann.


    Wenn ich nun es ohne Weiterleitung teste funktioniert der Logout nur zeitweise im Firefox. Mal wird der grüne Kreis rot und mal nicht. Desweiteren wird trotz Fenster schließen, der User nicht auf offline gesetzt. Dies kann ich auch nich nachvollziehen, weil die Sessions ja alle dabei zerstört werden.


    Zitat


    Wie kann man den auslesen ob ein User den Browser geschlossen hat.

    Wie kann ich den noch rausfinden ob der User überhaupt noch das browserfenster auf hat bzw wenn es auf ist und er es schliest .


    Beim Schließen des Browser werden nach meinem Wissen die ganzen Sessions zerstört. Dann überprüft man ob die Session noch vorhanden ist und wenn nein, dann wird der User offline gesetzt. Aber dies funktioniert bei mit aus unerklärlichen Gründen auch nicht.


    Stef

  • Ich habe jetzt nochmal nachgedacht.


    Ich erhalte die Id des Users über die Session. Mit dieser update ich dann die Tabellenreihen. Da ja dann bei dem schließen vom Browserfenster die Sessions zerstört werden ist diese Id undefined und daher wird das Statement nicht ausgeführt, da keine Session vorliegt.


    Daher wäre eine Möglichkeit beim Login die Id des Usernames als hidden feld mitzugeben. Dann hat man definitiv die Id des Users auch ohne Session.


    Das weitere Problem ist dann aber, dass ich diese Id nicht nur auf einer Seite brauche. Dann müsste ich die Daten trotzdem in eine Session speichern weil in den anderen Scripten dann keine Id vorhanden ist. Und dann kommt es wieder zum vorigen Problem, dass keine Session beim ausloggen oder Browser schließen vorliegt.


    Ist ziemlich kompliziert.

  • bei mir ist das so . Wenn ich den browser schliese oder den tab schliese und dann wieder auf mein Chat gehe ,brauche ich mich nicht einloggen weil die session noch lebt .Die geht bei mir nur kaputt wenn ich direkt auf logout klicke.


    Deswegen wollte ich nee möglichkeit suchen zb ( browser events oder so ) womit ich die session zerstören kann.

    Icch weiß ja nicht wie das bei den anderen ist.aber mein cookie lebt solange bis ich ihn schrotte ,deswegen verstehe ich das gerade irgendwie nicht

  • ich setzte den Cookie immer mit session strat , wie macht man das den ohne Expiration ?


    und das mit unbeforeunload und onunload hat ja irgendwie nicht geklappt . Habe da auch reichlich nach gegoogelt und viele Beispiele ausprobiert .

    Auch so beispiele die nach klick des X noch ein Alert geben mit """und schüß""" haben auch nicht Funktioniert . Kann das sein das es bei den neueren Browser nicht mehr klappt ?

    Also irgendwas läuft hier wieder gewaltig schief.Es geht in 2 Browsern nicht ,mehr habe ich jetzt nicht getestet

  • ich setzte den Cookie immer mit session strat , wie macht man das den ohne Expiration ?

    Je nach Browser:

    Code
    document.cookie = 'foo=bar; expires=0; path=/';
    document.cookie = 'foo=bar; path=/'

    ...halt ohne Expiration!


    Oder auf SessionStorage umsteigen:

    Code
    sessionStorage['foo'] = 'bar';
    alert( sessionStorage['foo'] );
  • Hey,


    Arne Drews :

    Zitat

    Setz doch den Cookie ohne Expiration Angabe, dann ist das ein Session-Cookie und sollte beim Schließen des Browsers wech sein.

    Ob das auch für Tabs gilt, weiß ich adhoc nicht, musst Du mal versuchen.

    Das bringt aber auch nicht viel. Denn ich brauche ja die ID aus der Session für das Updaten der DB-Reihe. Siehe Code.


    Meine Überlegung ist, dass ich einen Cookie für eine bestimmte Zeit erstelle und eine Session. Wenn die Session zerstört wird läuft der Cookie je nach dem wie lange der User im Chat ist noch weiter. Wenn der User aber länger im Chat ist als die Laufzeit des Cookies wird es überprüft und dann wird der Cookie neu gesetzt. Die SESSION und der COOKIE haben dann den gleichen Inhalt.


    Was meinst du dazu?

  • Aber bei PHP-Sessions hast Du doch schon einen SessionCookie, wofür brauchst Du denn noch einen?

    Wenn sich ein User einloggt erhält er eine Session. In dieser wird dann die userId gespeichert. Nun wenn der User sich aber ausloggt oder den Browser komplett schließt wird die Session ja sofort gelöscht. Das heißt die ganzen Abfragen, bei denen man diese Id aus der Session benötigt, fehlschlagen.


    Bei einem Logout kann man es ja so machen, dass man erst wenn das Update zum Status "offline" erfolgreich war die Session zerstört. Denn solange noch ein weiterer Tab geöffnet ist bleibt die Session erhalten.


    Beim sofortigen Fenster löschen wird die Session ja sofort gelöscht/zerstört. Dazu brauche ich noch eine andere Quelle die die ID als Value besitzt.

    Ich versuche es mal mit den beiden, von dir genannten Funktionen, onbeforeunload/unload. Diese werden, so wie ich es verstanden habe, erst ausgeführt, wenn etwas nicht ladbar ist.


    Ich melde mich dann nochmal später.

  • Ich habe nun meine Ideen umgesetzt und deine Vorschläge mit den beiden Funktionen.


    Nun funktioniert alles soweit wie es sein soll, auch wenn der User den Browser schließt. Aber was jetzt sehr komisch ist, ist dass beim Browser Firefox der Logout klappt und beim Google Chrome nicht. Ich habe auch schon die ganzen Daten bereinigt.


    So führe ich den Logout aus:

    In die Variable Result wird dann die Zahl der geupdateten Reihen gespeichert. Wenn alles erfolgreich war ist diese 1. Somit überprüfe ich ob $result gleich 1 ist und wenn ja führe ich die weiteren Logoutaktionen aus.


    Bei Google Chrome kommt bei $result immer 0 raus obwohl die Tabellenreihe geupdatet wird. Ich weiß nicht warum.


    Desweiteren habe ich noch eine Frage zur JS-Function onbeforeunload. Wenn ich jetzt doch den Browser komplett schließe, wie kann denn trotzdem der Status dann im Update-Statement auf offline gesetzt werden? Weil es sollte doch eigentlich keine Session mehr vorhanden sein?


    Dies ist die Lösung:

    Grüße,

    Stef

  • Mal 2 fragen . Wie ich gelesen habe wid der cockie beim verlassen des Browser zerstört . Aber die session wird von Server nach einer x beliebigen Zeit gelöscht .So habe ich das beim ganzen lesen verstanden. Ist das soweit richtig ? Kann man die session auch sofort Löschen ? Das was ich gelesen habe ,habe ich nicht ganz verstanden. Ist es überhaupt notwendig den sofort zu Löschen ? Wenn ich den Broweser schliese und mein Sohn ihn wieder auf macht ,müsste er doch aus den Chat rausgeflogen sein und kann auf meiner session nicht weiter chatten .Oder geht das doch noch wenn die Session auf den Server noch nicht gelöscht wurde ?


    Habe jetzt einiges gelesen wie man Chats mit websocket Herstellt .Wußte gar nicht das http und https da auch noch unterschiede mitbringen. Aber egal.

    Was für vorteile hat das mit den websocket ? Ist da überhaupt ein Vorteil dran ,außer das die requeste wenniger sind ? .Ist polling da besser ?

    Das mit den polling habe ich jetzt verstanden , und auch mal für mich alleine getestet .Das scheint ja gut zu klappen .Weiß zwar nicht wie ich das jetzt noch in mein Chat einbauen soll ,aber der hat sowieso noch Fehler da kommt es auf ein problem mehr auch nicht mehr an.


    Also Websocket Ja oder Nein und Warum ? Danke für die Antworten

  • Kann man die session auch sofort Löschen ?

    Lest ihr die Doku zu den Dingen, die ihr produktiv verwendet?!

    PHP
    <?php
    session_destroy();


    Wenn ich den Broweser schliese und mein Sohn ihn wieder auf macht ,müsste er doch aus den Chat rausgeflogen sein und kann auf meiner session nicht weiter chatten .Oder geht das doch noch wenn die Session auf den Server noch nicht gelöscht wurde ?

    Eine PHP Session sendet auch nur einen Cookie an den Client. Findet er die Information nicht mehr, kann darüber auch keine Assoziation mehr hergestellt werden. Daher: Session-Cookies.


    Also Websocket Ja oder Nein und Warum ? Danke für die Antworten

    Ein Socket Server wird als Dienst/Service gefahren, Polling hingegen findet per Script zur Laufzeit statt.

    Der Vorteil von Websockets liegt hier u.a. bei der Performance.


    Ich sag mal von meinem Standpunkt aus: Definitiv JA!

  • Hey,


    Zitat

    Wie ich gelesen habe wid der cockie beim verlassen des Browser zerstört . Aber die session wird von Server nach einer x beliebigen Zeit gelöscht .So habe ich das beim ganzen lesen verstanden. Ist das soweit richtig ?

    Kann man die session auch sofort Löschen ? Das was ich gelesen habe ,habe ich nicht ganz verstanden. Ist es überhaupt notwendig den sofort zu Löschen ? Wenn ich den Broweser schliese und mein Sohn ihn wieder auf macht ,müsste er doch aus den Chat rausgeflogen sein und kann auf meiner session nicht weiter chatten .Oder geht das doch noch wenn die Session auf den Server noch nicht gelöscht wurde ?


    Du vermischst da 2 Sachen. Einmal Sessions und Cookies. Die Sessions werden zerstört wenn der Browser komplett geschlossen wurde oder wenn der Befehl gegeben wurde, dass diese zerstört werden soll. Den Cookies gibt man eine feste Laufzeit. In dieser Laufzeit sind sie, auch egal ob der Browser bereits geschlossen ist, vorhaden. Außer man gibt auch da den Befehl, dass der Cookie zerstört werden soll.


    Es gibt Funktionen, welche man ausführen kann, um die Session oder den Cookie auch früher zu löschen (session_destroy(), unset()).

    Dein Sohn muss sich dann erstmal wieder anmelden. Und wenn er keine Anmeldedaten hat kommt er da auch nicht rein.


    Zu den Websockets kann ich dir nichts sagen. Habe mich mit denen noch nicht beschäftigt.

  • Du vermischst da 2 Sachen. Einmal Sessions und Cookies. Die Sessions werden zerstört wenn der Browser komplett geschlossen wurde oder wenn der Befehl gegeben wurde, dass diese zerstört werden soll. Den Cookies gibt man eine feste Laufzeit. In dieser Laufzeit sind sie, auch egal ob der Browser bereits geschlossen ist, vorhaden. Außer man gibt auch da den Befehl, dass der Cookie zerstört werden soll.

    Ich würde eher sagen, dass Du gerade etwas trennen willst, was eigentlich zusammengehört bzw. fast das gleiche ist.

    Sessions verwenden Cookies. Dass die Session "zerstört" wird, wie Du schreibst, liegt daran, dass die Cookies ausschließlich für die Session-Lifetime definiert wurden: Session-Cookies eben.


    Du beschreibst inhaltlich lediglich den Unterschied zwischen Cookies mit und Cookies ohne Expiration, letztere sind sog. Session-Cookies, wie sie von Sessions verwendet werden. Cookies sind es jedoch in beiden Fällen!

  • Ich würde eher sagen, dass Du gerade etwas trennen willst, was eigentlich zusammengehört bzw. fast das gleiche ist.

    Sessions verwenden Cookies. Dass die Session "zerstört" wird, wie Du schreibst, liegt daran, dass die Cookies ausschließlich für die Session-Lifetime definiert wurden: Session-Cookies eben.


    Du beschreibst inhaltlich lediglich den Unterschied zwischen Cookies mit und Cookies ohne Expiration, letztere sind sog. Session-Cookies, wie sie von Sessions verwendet werden. Cookies sind es jedoch in beiden Fällen!

    Okay.


    Ich habe es bei Tutorials gelernt und es so aufgenommen, dass Sessions und Cookies nicht das gleiche sind. Sessions kann man keine Lifetime mitgeben, Cookies kann man das. Nach meinem Wissensstand. Mit "Expiration" meinst du dann, dass man die Lebenszeit des Cookies einstellen kann, bzw. der Cookie solange lebt wie wir Programmierer es möchten?


    Habe mir nochmal beides in der PHP-Doku angeschaut. Du hast recht. Da haben die Tutorials es falsch rübergebracht oder ich habe es falsch verstanden.


    Danke für die Info. :)


    Grüße,

    Stef

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!