class
DbSessionHandler
implements
SessionHandlerInterface
{
public
$sessionTable
=
'session_table'
;
public
$autoCreateSessionTable
= true;
public
$expireTime
= 1200;
private
function
createTable()
{
DB::query(
'START TRANSACTION;'
);
DB::query("
CREATE TABLE `{
$this
->sessionTable}` (
`id` char(32) NOT NULL,
`data` longblob NOT NULL,
`expire` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
");
DB::query(
"ALTER TABLE `{$this->sessionTable}` ADD PRIMARY KEY (`id`);"
);
DB::query(
'COMMIT;'
);
}
private
function
deleteExpired()
{
return
DB::query(
"DELETE FROM `{$this->sessionTable}` WHERE (`expire`<:expire)"
, [
':expire'
=> time()]);
}
public
function
close()
{
return
true;
}
public
function
destroy(
$session_id
)
{
DB::query(
"DELETE FROM `{$this->sessionTable}` WHERE (`id`=:id)"
, [
':id'
=>
$session_id
]);
return
true;
}
public
function
gc(
$maxlifetime
)
{
$this
->deleteExpired();
return
true;
}
public
function
open(
$save_path
,
$name
)
{
if
(
$this
->autoCreateSessionTable) {
if
(
$this
->deleteExpired() < 0) {
$this
->createTable();
}
}
return
true;
}
public
function
read(
$session_id
)
{
$data
= DB::arrayQuery(
"SELECT `data` FROM `{$this->sessionTable}` WHERE (`id`=:id AND `expire`>=:expire)"
, [
':id'
=>
$session_id
,
':expire'
=> time()]);
return
(
count
(
$data
) > 0 ?
base64_decode
(
$data
[0]->data) :
''
);
}
public
function
write(
$session_id
,
$session_data
)
{
return
DB::query(
"REPLACE INTO `{$this->sessionTable}` VALUES (:id, :data, :expire)"
, [
':id'
=>
$session_id
,
':data'
=>
base64_encode
(
$session_data
),
':expire'
=> time() +
$this
->expireTime]) > 0;
}
}