hedera-web/web/db-session-handler.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;
}
}