Author Topic: Fast 1000 alte Datensätze in der Tabelle "session"  (Read 5973 times)

Offline MadMax

  • Newbie
  • *
  • Posts: 3
Fast 1000 alte Datensätze in der Tabelle "session"
« on: December 30, 2010, 09:08:29 PM »
Hallo,

ich habe heute ein Update auf die Version 0.4.2 gemacht und dabei festgestellt, dass in der mySQL-Datenbank die Tabelle session fast 1000 Einträge enthält. Wie es aussieht, werden alte Sessions nicht wieder entfernt.

$rcmail_config['session_lifetime'] = 10;
$rcmail_config['min_keep_alive'] = 60;

Kann ich die 1000 Zeilen entfernen? Warum werden die Sessions nicht automatisch aus der DB entfernt, wenn die Sessions ablaufen?

Viele Grüße

Robert

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Fast 1000 alte Datensätze in der Tabelle "session"
« Reply #1 on: December 31, 2010, 01:18:58 AM »
Die abgelaufenen Sessions sollten automatisch entfernt werden. Funktioniert jedenfalls bei mir einwandfrei.

Du kannst den 'sessions' table problemlos leeren. Das schlimmste was passiert, ist, dass angemeldete User ausgelogged werden.
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline MadMax

  • Newbie
  • *
  • Posts: 3
Fast 1000 alte Datensätze in der Tabelle "session"
« Reply #2 on: January 04, 2011, 04:48:38 AM »
Vielen Dank! Ich werde das mal im Auge behalten, ob die Sessions in zukunft automatisch gelöscht werden.

Offline oldschool

  • Sr. Member
  • ****
  • Posts: 406
Fast 1000 alte Datensätze in der Tabelle "session"
« Reply #3 on: January 04, 2011, 08:58:09 PM »
Ja, komisch.

Ich hab´ das mal eben bei der installierten 0.5-RC Testversion überprüft.
Es tritt genau dieser Effekt auf.

Rosali, das scheint mir nicht ganz koscher...



Rgds.

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Fast 1000 alte Datensätze in der Tabelle "session"
« Reply #4 on: January 05, 2011, 12:14:12 AM »
PHP.net
Quote

gc
Der Speicherbereiniger (garbage collector) wird ausgeführt, wenn der Session-Speicherbereiniger ausgeführt wird. Er erwartet die maximale Session-Verfallszeit als einzigen Parameter.


Der Garbage Collector kann benuterdefiniert festgelegt werden.

Quote

bool session_set_save_handler ( callback $open , callback $close , callback $read , callback $write , callback $destroy , callback $gc )


Das erfolgt in rcube_session.php:

    
// set custom functions for PHP session management
    
session_set_save_handler(
      array(
$this'open'),
      array(
$this'close'),
      array(
$this'read'),
      array(
$this'write'),
      array(
$this'destroy'),
      array(
$this'gc'));
  }


Die Garbage Collector funktion sieht folgendermaßen aus:

  
// garbage collecting function
  
public function gc($maxlifetime)
  {

... hier räumt er die Tabelle auf

    
// just delete all expired sessions
    
$this->db->query(
      
sprintf("DELETE FROM %s WHERE changed < %s",
        
get_table_name('session'), $this->db->fromunixtime(time() - $maxlifetime)));

... und hier löscht er alte Files aus dem Temp Verzeichnis.

    
foreach ($this->gc_handlers as $fct)
      
$fct();

    return 
true;
  }


Der Aufruf der Funktion erfolgt durch PHP entsprechend den Definition in der php.ini:

Define the probability that the 'garbage collection' process is started
on every session initialization.
The probability is calculated by using gc_probability/gc_divisor,
e.g1/100 means there is a 1chance that the GC process starts
on each request.

session.gc_probability 1
session
.gc_divisor     100


Die Grundeinstellung ist, dass im Ergebnis bei jedem 100. Login der Garbage Collector aufgerufen wird. Wenn also nur wenige User auf dem System sind, dann kann das schon eine Weile dauern. Es handelt sich dabei um eine Wahrscheinlichkeit. Es kann also durchaus sein, dass auch nach dem 500. Login noch nicht aufgeräumt wurde.

Wenn ihr also session.gc_divisor auf 1 oder session.gc_probability auf 100 setzt dann müsste die Tabelle m.E. nach einem Apache Neustart in jedem Fall bereinigt werden. Ich meine, dass Roundcube diese Werte unverändert lässt.

In der Theorie müssten somit alte Einträge aus der Session-Tabelle entfernt werden. Das tut es bei mir auch in der Praxis.

Mehr habe ich zu diesem Thema nicht gefunden und ich hoffe, dass ich richtig liege. Vorher habe ich mich damit auch noch nie befasst.
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Fast 1000 alte Datensätze in der Tabelle "session"
« Reply #5 on: January 05, 2011, 10:54:26 AM »
Ergänzung:

Ich habe gerade bemerkt, dass session.gc_divisor in der Roundcube .htaccess auf 500 gesetzt wird. Wenn also die Session-Tabelle öfters geleert werden soll, dann .htaccess ändern. Eine Änderung der php.ini bliebe wirkungslos.

.htaccess

#php_value
	
session.cookie_path /
php_value
	
session.auto_start
	
0
php_value
	
session.gc_maxlifetime 21600
php_value
	
session.gc_divisor
	
500
php_value
	
session.gc_probability 1
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline oldschool

  • Sr. Member
  • ****
  • Posts: 406
Fast 1000 alte Datensätze in der Tabelle "session"
« Reply #6 on: January 05, 2011, 03:31:28 PM »
Thaaanx!

Ich behalt das mal im Auge...



Rgds.