Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] eigenes session handling problem mit write()

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] eigenes session handling problem mit write()

    hallo,
    ich verwende ein datenbankbasiertes eigenes Session-handling um den Online-Status von Benutzern über die Datenbank abzurufen.

    Jetzt gibt es bei mir einen Bereich indem per Ajax automatisch in regelmäßigen Abständen eine Aktualisierung durchgeführt wird, ohne das der Nutzer dazu eine Aktion durchführen muss.

    Jetzt wollte ich hier jedoch, dass die "last_update-Spalte" durch diese automatische Aktualisierung nicht erhöht wird, sodass der Nutzer dann automatisch ausgeloggt wird bzw. als AFK(away from keyboard) ausgewiesen wird,wenn er längere Zeit nichts unternimmt.

    Dazu muss jedoch auch eine $_SESSION Variable abgefragt,also eigentlich nur gelesen werden.Leider wird hierbei aus mir unerklärlichen Gründen auch die write()-Methode des Session-handlers ausgeführt,sodass "last_update" ebenso erhöht wird.

    Bereits diese if-Abfrage verursacht eine Aktualisierung:
    PHP-Code:
    /*ajax.php:*/
    ..
    if(!isset(
    $_SESSION))
                            {
                            
    session_set_save_handler(new db_login());    
                            
    session_name('my_session_handler');
                            
    session_start();
                            }
    ..
    /*db_login.class.php*/
    class db_login extends \SessionHandler 
    {
    ..
    function 
    write($sesID,$data)
    {..}
    ..

    Meine Frage wäre also,wie kann ich das ungewollte Auslösen der write()-Methode verhindern?
    Anm.
    Kann doch eigentlich garnicht sein,nach meiner Überlegung müsste die write()-Methode doch nur aufgerufen werden,wenn ich eine $_SESSION Variable z.B. über $_SESSION['example']='xyz'; verändere oder neu anlege,oder?

    EDIT:
    Ich habe das datenbankbasierte Session-handling aus einem buch nhazu 1:1 übernommen und bin bei der überprüfung auf das hier gestoßen:
    PHP-Code:
    class db_login extends \SessionHandler 
    {
    ..
    function 
    __construct() 
        {      
            
    register_shutdown_function('session_write_close');
        }
    ..

    Leider ist mir nicht ganz klar was die "register_shutdown_function" macht(wird im buch auch nicht weiter erklärt),doch nehme ich mal an das der Parameter "'session_write_close" für mein Problem verantwortlich sein könnte.Wenn es so wäre,welchen Parameter sollte ich stattdessen verwenden?


  • #2
    weiß hier keiner was dazu?

    Kommentar


    • #3
      Da bin ich auch kein Spezialist.

      Doch bei meinem sieht es so aus:
      PHP-Code:
      class SessionStorageDatabase extends SessionStorage {

          public function 
      __construct($services) {
              
      session_set_save_handler(array($this'open'), array($this'close'), array($this'read'), array($this'write'), array($this'destroy'), array($this'gc'));
              
      register_shutdown_function('session_write_close');
          }


      Das kommt mir ein bisschen komisch vor:
      PHP-Code:
      if(!isset($_SESSION))
                              {
                              
      session_set_save_handler(new db_login());    
                              
      session_name('my_session_handler');
                              
      session_start();
                              } 
      session_start() muss immer aufgerufen werden und nicht nur wenn if(!isset($_SESSION))

      Kommentar


      • #4
        PHP trackt nicht mit ob änderungen an der Session ausgeführt wurden. Wenn du die Session öffnest wird sie beim schleißen zwangsläufig wieder geschreiben. Wenn du das nicht möchtest, musst du selbst was implementieren.
        Alternativ kannst du auch bis PHP 7 warten, dort ist vorgesehen eine Session read only zu öffnen. Aber warten ist nicht jeder mans Ding.

        Kommentar


        • #5
          mhh,dann werd ich mir wohl was überlegen müssen
          bis vorrausichtlich fühestens oktober 2015 kann ich dann wirklich nicht warten
          Trotzdem Danke..
          EDIT:
          bevor ich mir jetzt unnötig den Kopf zerbreche,weiß jemand wie ich das am einfachsten für mein szenario realisieren kann?
          also einfacher denkanstoss würde schon reichen

          EDIT2:
          so ich hab mir dann doch den Kopf zerbrochen und die ideale Lösung für mich gefunden gefunden:
          -ich lese das session-cookie
          -lese die Daten aus der Datenbank
          -starte eine Fremdsession mit einem anderem Namen,welche ich dann per session_decode() mit den Daten aus der Datenbank fülle:
          PHP-Code:
          $ses_id=$_COOKIE['meine_datenbank_session'];
          //Datenbankabfrage
          //SELECT .. FROM session WHERE ses_id=$ses_id
          //->$MYSQL_SESSION(String aus DB)
          session_name('auto_refresh');
          session_start();
          $_SESSION=array();//alte daten löschen
          session_decode($MYSQL_SESSION);
          //vola ich kann $_SESSION so verwenden als ob es meine DB-basierte SESSION wäre(nur lesend),performance von session_decode ist dabei auch nur ca. 18x langsamer im Vergleich zum auslesen der $_SESSION 

          Kommentar

          Lädt...
          X