Ik heb sinds een half jaar een eigen PHP Session Handler Class geschreven.
Deze logt mij op random momenten uit, Het ene moment kan ik 2 uur zonder problemen werken op de site, het ander moment logt hij mij uit na de 2e klik binnen 1 minuut.
Als ik in de database kijk naar de laatste "view" tijd, dan staat deze wel goed ingesteld, de sessie is dus wel uitgelezen.
Hieronder mijn class:
<?php
class CSessionHandler implements SessionHandlerInterface
{
public static $SessionID = NULL;
public static $iSessionLifetime = 3600; // 30 minuten
public function __construct ( )
{
if ( is_numeric ( SYSTEM::GetSetting ( 'sysSessionLifetime' ) ) )
{
self::$iSessionLifetime = SYSTEM::GetSetting ( 'sysSessionLifetime' );
}
if ( ! session_set_save_handler ( $this ) )
{
new CLog ( 9009, 'Unable to implement our CSessionHandler. Please track the issue and fix this.' );
return;
}
ini_set ( 'session.gc_maxlifetime', self::$iSessionLifetime ); // expires in 30 minutes
ini_set ( 'session.cookie_lifetime', self::$iSessionLifetime ); // 30 minutes
ini_set ( 'session.save_path', dirname ( dirname ( __DIR__ ) ) . '/sessions' );
session_set_cookie_params ( self::$iSessionLifetime );
session_start ( );
}
public function open ( $sSavePath, $sSessionName )
{
// No need to open DB connection. (called at "session_start ( );")
return true;
}
public function close ( )
{
// No need to close DB connection.
$this->gc(); // Linux doesn't call the clean function, but uses a cronjob to delete session files.
return true;
}
public function read ( $sSessionID )
{
$oQuery = DB::Query ( "SELECT SessionValue FROM Sessions WHERE SessionID = ? AND TIMESTAMPDIFF(SECOND, SessionTime, NOW()) <= " . self::$iSessionLifetime, $sSessionID );
if ( DB::Num ( $oQuery ) > 0 )
{
DB::Query ( "UPDATE Sessions SET SessionTime = NOW() WHERE SessionID = ?", $sSessionID );
$aFetch = DB::Fetch ( $oQuery );
return $aFetch['SessionValue'];
}
return ''; // Session not set, return empty string. IMPORTANT!
}
public function write ( $sSessionID, $sSessionValue )
{
$oQuery = DB::Query ( "SELECT SessionID FROM Sessions WHERE SessionID = ?", $sSessionID );
if ( DB::Num ( $oQuery ) > 0 )
{
DB::Query ( "UPDATE Sessions SET SessionTime = NOW(), SessionValue = ? WHERE SessionID = ?", $sSessionValue, $sSessionID );
return true;
}
DB::Query ( "INSERT INTO Sessions (SessionID, SessionValue) VALUES (?,?)", $sSessionID, $sSessionValue );
return true;
}
public function destroy ( $sSessionID )
{
DB::Query ( "DELETE FROM Sessions WHERE SessionID = ?", $sSessionID );
return true;
}
public function gc ( $iSessionLifetime = null )
{
DB::Query ( "DELETE FROM Sessions WHERE TIMESTAMPDIFF(SECOND, SessionTime, NOW()) > " . self::$iSessionLifetime );
return true;
}
public static function GetActiveUserSessions ( )
{
$oQuery = DB::Query ( "SELECT * FROM Sessions WHERE SessionValue LIKE '%userID%' AND TIMESTAMPDIFF(SECOND, SessionTime, NOW()) < " . self::$iSessionLifetime . " GROUP BY SessionID" );
return DB::Num ( $oQuery );
}
}
?>
Zoals jullie zien heb ik al diverse pogingen gedaan via ini_set, maar helaas.
Bij het deactiveren van deze class werkt alles weer naar behoren.
Zien jullie waar het probleem zit?