sessions in mysql verwalten!

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

  • sessions in mysql verwalten!

    Hallo,

    ich wollte eigentlich die Sessions in der Datenbank verwalten um das lästige weiterreichen der Session-Id in Cookies oder Url zu verhindern.

    Ich hab mich in die Thematik eingelesen, und die Session-verwaltung so umgesetzt! Geht auch alles!

    Allerdings sind die Abfragen, der Datenbank so was von langsam, das ich es so nicht einsetzen kann! Weiß jemand warum, habe ich vielleicht etwas nicht beachtet?

    Ich setze das auch noch nicht produktiv sondern nur local auf einem Testsystem ein. Und die Verwaltung ist bei ein paar Session-Werten in DB trotzdem so etwas von langsam!

    Hier mal einige auzüge aus meiner Klasse!

    Zu erst mach im Konstrukt:
    PHP-Code:
            session_set_save_handler(array(&$this,'session_open'),
                                     array(&
    $this,'session_close'),
                                     array(&
    $this,'session_read'),
                                     array(&
    $this,'session_write'),
                                     array(&
    $this,'session_destroy'),
                                     array(&
    $this,'session_clean')
                                     );
            
    register_shutdown_function('session_write_close');
            if (!
    session_id()) {
                @
    session_start();
            } 
    jetzt die Funktionen:

    PHP-Code:
        /**
         * Open the session
         */
        
    public function session_open($strSavePath,$strSessionName) {
            if (
    $this->mysql_connect()) {
                return 
    true;
            }
            return 
    false;
        }

        
    /**
         * Close the session
         */
        
    public function session_close() {
            return 
    true;
        }

        
    /**
         * Read the session
         */
        
    public function session_read($strSessionId) {
            
    $strSessionId mysql_real_escape_string($strSessionId);
            
    $strSQLCmd "SELECT data FROM sessions WHERE sessionId='".$strSessionId."' LIMIT 1";
            if (
    $arrSession $this->mysql_select($strSQLCmd)) {
                return 
    $arrSession[0]['data'];
            }
            return 
    '';
        }

        
    /**
         * Write the session
         */
        
    public function session_write($strSessionId,$strData) {
            
    $intLifeTime ini_get('session.gc_maxlifetime')+time();
            
    $strSQLCmd "REPLACE INTO sessions VALUES('".$strSessionId."',".$intLifeTime.",'".$strData."')";
            
    //$strSQLCmd = "UPDATE sessions SET expires=".$intLifeTime.",data='".$strData."' WHERE sessionId='".$strSessionId."'";
            
    if ($this->mysql_query($strSQLCmd)) {
                return 
    true;
            }
            return 
    false;
        }

        
    /**
         * Destoroy the session
         */
        
    public function session_destroy($strSessionId) {
            
    $strSQLCmd "DELETE FROM sessions WHERE sessionId='".$strSessionId."'";
            if (
    $this->mysql_query($strSQLCmd)) {
                return 
    true;
            }
            return 
    false;
        }

        
    /**
         * Garbage Collector
         * @param int life time (sec.)
         * @return bool
         * @see session.gc_divisor      100
         * @see session.gc_maxlifetime 1440
         * @see session.gc_probability    1
         * @usage execution rate 1/100
         *        (session.gc_probability/session.gc_divisor)
         */
        
    public function session_clean($intMax) {
            
    $strSQLCmd "DELETE FROM sessions WHERE expires<".(time()-$intMax);
            if (
    $this->mysql_query($strSQLCmd)) {
                return 
    true;
            }
            return 
    false;
        } 
    Nach meinem Gefühl ist das REPLACE INTO das problem, was so lahmt!

    Danke!
    Zuletzt geändert von TriphunEM; 04.03.2010, 09:42.

  • #2
    Zitat von TriphunEM Beitrag anzeigen
    ich wollte eigentlich die Sessions in der Datenbank verwalten um das lästige weiterreichen der Session-Id in Cookies oder Url zu verhindern.
    Aha. Und wie übergibst du die Session ID sonst, wenn nicht in Cookies oder in der URL?

    Kommentar


    • #3
      Zitat von h3ll Beitrag anzeigen
      Aha. Und wie übergibst du die Session ID sonst, wenn nicht in Cookies oder in der URL?
      würde mich auch mal interessieren
      h.a.n.d.
      Schmalle

      http://impressed.by
      http://blog.schmalenberger.it



      Wichtige Anmerkung: Ich habe keine Probleme mit Alkohol ...
      ... nur ohne :-)

      Kommentar


      • #4
        Hab ich ja bisher so gemacht!
        Aber da ich Url-Rewriting jetzt betreiben, hat die session-Id in der Url nix zu suchen. Und Cookies sind zu unsicher, da man diese im Browser deaktivieren kann!

        Bitte zurück zu meiner Frage, danke! ;O)

        Kommentar


        • #5
          Zitat von TriphunEM Beitrag anzeigen
          Hab ich ja bisher so gemacht!
          Aber da ich Url-Rewriting jetzt betreiben, hat die session-Id in der Url nix zu suchen. Und Cookies sind zu unsicher, da man diese im Browser deaktivieren kann!

          Bitte zurück zu meiner Frage, danke! ;O)
          Du hast die Frage immer noch nicht beantwortet, wie du die Session-ID übergeben willst. Was bringen dir Sessions in der Datenbank, wenn du sie nicht dem jeweiligen Benutzer zuordnen kannst?

          Kommentar


          • #6
            Zitat von TriphunEM Beitrag anzeigen
            Nach meinem Gefühl ist das REPLACE INTO das problem, was so lahmt!
            Gefühl? Wie wäre es mit Messen?!

            Übrigens steht im Manual 'The "write" handler is not executed until after the output stream is closed', was bedeutet, dass der Output schon beim Client ist und der die Verzögerung durch REPLACE INTO gar nicht mehr mitbekommt.

            Übrigens zielen die anderen beiden mit ihrer Frage darauf ab, woher $strSessionId bei session_read() kommt. Wenn du dich jetzt ans Messen und Debuggen machst, untersuche das mal mit - wirst dich wundern.

            Kommentar


            • #7
              Den Unsinn mit der SessionID haben dir die Anderen ja schon verkauft.
              Fakt ist: Ohne, dass dir der Browser eine SessionID sendet wirst du niemals eine Session auf dem Server etablieren können.
              Mit keiner Methode!

              Aber zu deinem Handler:
              Vergiss nicht das Sessionlocking zu implementieren. Sonst drohen "Race Conditions".
              Wir werden alle sterben

              Kommentar


              • #8
                hm, ich dachte durch die DB-Variante bräuchte ich keine Session-ID mit übergeben, da PHP den zusammenhang an hand der Client-Daten selber erkennt.

                Wie kann ich die Session-ID noch weiterreichen, ohne url oder cookie...

                selber an hand ip, browserinfos in einer db speichern???

                Kommentar


                • #9
                  Zitat von TriphunEM Beitrag anzeigen
                  hm, ich dachte durch die DB-Variante bräuchte ich keine Session-ID mit übergeben, da PHP den zusammenhang an hand der Client-Daten selber erkennt.

                  Wie kann ich die Session-ID noch weiterreichen, ohne url oder cookie...

                  selber an hand ip, browserinfos in einer db speichern???
                  Gar nicht. Weder IP noch Browserinfos sind eindeutig.

                  Kommentar


                  • #10
                    Was ist denn an einem Session Cookie so schlimm? Ohne Session Cookies kann man heutzutage gar nicht mehr vernünftig surfen und du kannst davon ausgehen, dass jeder Browser Session Cookies erlaubt.

                    Kommentar


                    • #11
                      naja, solange man die ausschalten kann, hab ich ein schlechtes bauchgefühl...

                      Kommentar


                      • #12
                        Zitat von TriphunEM Beitrag anzeigen
                        naja, solange man die ausschalten kann, hab ich ein schlechtes bauchgefühl...
                        Dann musst du mit dem schlechten Bauchgefühl klar kommen. Es gibt einen Grund, warum PHP auf Cookies setzt. Aus Spaß hat sich das Niemand ausgedacht. Wenn man einen Browser auf einfache Art anders identifizieren könnte, würde das jeder so machen. Aber das ist nun mal nicht der Fall.

                        Kommentar


                        • #13
                          Wenn jemand Session Cookies nicht erlaubt, musst du die SID in der URL übertragen (Fallback). Anders geht es nicht.
                          Aber mal ehrlich, warum machst du dir diese Mühe? Hast du auf deiner Seite über längere Zeit getestet, wie viele User keine Session Cookies erlauben? Vermutlich nicht, denn dann hättest du erkannt, dass die Zahl derer gegen Null geht.

                          Kommentar

                          Lädt...
                          X