| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

04-03-2010, 09:40
|
|
TriphunEM
Registrierter Benutzer
|
|
Registriert seit: Jun 2003
Beiträge: 538
|
|
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!
Geändert von TriphunEM (04-03-2010 um 09:42 Uhr)
|

04-03-2010, 10:14
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.327
|
|
Zitat:
Zitat von TriphunEM
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?
|

04-03-2010, 10:18
|
 |
schmalle
  Ich Root, Du nix
|
|
Registriert seit: Jun 2001
Ort: Egelsbach FFM
Beiträge: 9.170
|
|
Zitat:
Zitat von h3ll
Aha. Und wie übergibst du die Session ID sonst, wenn nicht in Cookies oder in der URL?
|
würde mich auch mal interessieren
|

04-03-2010, 10:28
|
|
TriphunEM
Registrierter Benutzer
|
|
Registriert seit: Jun 2003
Beiträge: 538
|
|
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)
|

04-03-2010, 10:31
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.327
|
|
Zitat:
Zitat von TriphunEM
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?
|

04-03-2010, 10:50
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Zitat:
Zitat von TriphunEM
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.
|

04-03-2010, 10:58
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
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".
|

04-03-2010, 11:11
|
|
TriphunEM
Registrierter Benutzer
|
|
Registriert seit: Jun 2003
Beiträge: 538
|
|
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???
|

04-03-2010, 11:14
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.327
|
|
Zitat:
Zitat von TriphunEM
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.
|

04-03-2010, 11:16
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
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.
|

04-03-2010, 11:20
|
|
TriphunEM
Registrierter Benutzer
|
|
Registriert seit: Jun 2003
Beiträge: 538
|
|
naja, solange man die ausschalten kann, hab ich ein schlechtes bauchgefühl...
|

04-03-2010, 11:23
|
|
h3ll
Registrierter Benutzer
|
|
Registriert seit: Mar 2008
Beiträge: 2.327
|
|
Zitat:
Zitat von TriphunEM
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.
|

04-03-2010, 11:24
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
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.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|