61 lines
1.3 KiB
PHP
61 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace Vn\Web;
|
|
|
|
class DbSessionHandler implements \SessionHandlerInterface {
|
|
const UPDATE_INTERVAL = 30;
|
|
private $db;
|
|
|
|
function __construct($db) {
|
|
$this->db = $db;
|
|
}
|
|
|
|
function open($savePath, $name) {
|
|
return TRUE;
|
|
}
|
|
|
|
function close() {
|
|
return TRUE;
|
|
}
|
|
|
|
function read($sessionId) {
|
|
$sessionData = $this->db->getValue(
|
|
'SELECT data FROM userSession WHERE ssid = #', [$sessionId]);
|
|
return isset($sessionData) ? $sessionData : '';
|
|
}
|
|
|
|
function write($sessionId, $sessionData) {
|
|
$session = $this->db->getObject(
|
|
'SELECT data, lastUpdate < (NOW() - INTERVAL # SECOND) hasToRefresh
|
|
FROM userSession WHERE ssid = #',
|
|
[self::UPDATE_INTERVAL, $sessionId]
|
|
);
|
|
|
|
if (!isset($session)
|
|
|| $sessionData !== $session->data
|
|
|| $session->hasToRefresh) {
|
|
$this->db->query(
|
|
'INSERT INTO userSession SET
|
|
ssid = #, data = #, lastUpdate = NOW()
|
|
ON DUPLICATE KEY UPDATE
|
|
data = VALUES(data), lastUpdate = VALUES(lastUpdate)',
|
|
[$sessionId, $sessionData]);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
function destroy($sessionId) {
|
|
$this->db->query('DELETE FROM userSession WHERE ssid = #', [$sessionId]);
|
|
return TRUE;
|
|
}
|
|
|
|
function gc($maxLifeTime) {
|
|
$this->db->query('DELETE FROM userSession
|
|
WHERE lastUpdate < (NOW() - INTERVAL # SECOND)',
|
|
[$maxLifeTime + self::UPDATE_INTERVAL + 1]
|
|
);
|
|
return TRUE;
|
|
}
|
|
}
|