Ik wil onderstaande zelf gebouwde custom session handler class gebruiken. Alles werkt op zich. Behalve gaat er iets fout hij het cleanen van de sessie. Ik heb voor te testen de maxlifetime op 15s ingesteld, en de kans op cleaning is 100%, dus elke keer wordt de cleaning functie aangeroepen.
In de database worden de sessie's opgeslagen. Zoals je aan de clean_session() functie ziet, worden oude sessies gedeleted. Echter wanneer ik na 15sec de pagina refresh, staat de sessie nog altijd in de DB. Op een of andere manier wordt de sessie wel gewijzigd, maar direct daarna weer aangemaakt met de zelfde data. Dat eerste kan ik nog verklaren, maar het tweede niet? Wie weet wat hier aan te doen is, volgens mij zie ik gewoon iets over het hoofd.
<?php
class session {
private $instance;
function __construct() {
session_set_save_handler(
array($this, "open_session" ),
array($this, "close_session" ),
array($this, "read_session" ),
array($this, "write_session"),
array($this, "destroy_session"),
array($this, "clean_session" )
);
}
function open_session() {
require_once('mysql.class.php');
if ($this->instance = mysql::get_instance()->connection) {
return true;
}
}
function close_session() {
return mysql_close($this->instance);
}
function read_session($sid) {
$query = sprintf('SELECT data FROM sessions WHERE id="%s"',mysql_real_escape_string($sid));
$result = mysql_query($query);
if (mysql_num_rows($result) == 1) {
list($data) = mysql_fetch_array($result);
return $data;
}
else {
return '';
}
}
function write_session($sid, $data) {
$query = sprintf('REPLACE INTO sessions (id, data, last_accessed) VALUES ("%s", "%s", NOW())',mysql_real_escape_string($sid), mysql_real_escape_string($data));
$result = mysql_query($query);
return mysql_affected_rows($this->instance);
}
function destroy_session($sid) {
$query = sprintf('DELETE FROM sessions WHERE id="%s"',mysql_real_escape_string($sid));
$result = mysql_query($query);
$_SESSION = array();
return mysql_affected_rows($this->instance);
}
function clean_session($expire) {
$query = sprintf('DELETE FROM sessions WHERE DATE_ADD(last_accessed, INTERVAL %d SECOND) < NOW()', (int) $expire);
$result = mysql_query($query);
return mysql_affected_rows($this->instance);
}
function __destruct() {
session_write_close();
$this->instance = null;
}
}
//ini-settings
ini_set('session.gc_maxlifetime','15');
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
$session = new session();
session_start();
?>
1.300 views