session_set_save_handler gc ($ maxlifetime) рабочая концепция

Руководство по php.net session_set_save_handler Пример основан на файле. Я пытался реализовать это для MySQL.

я работаю с UniServer в окнах. Моя настройка отображения ошибок — среда разработки.

моя проблема в том, что я не могу заставить функцию сбора мусора работать автоматически. Я не получил ошибку / предупреждение. все мои связанные коды приведены ниже.

Что я имею в виду под автоматически, это: если я использую $handler->gc($maxlifetime); в index.php после моего сеанса тестирования он работает и удаляет просроченные строки.

Если я не использую $handler->gc($maxlifetime); в index.php просроченные строки остаются.

мои вопросы

q1 — я должен использовать $handler->gc($maxlifetime); в index.php?

q2 — если ответом на q1 является ДА, почему функция обратного вызова имеет gc функция.

q3 — если ответ на q1 НЕТ, почему мои просроченные строки не удаляются (в случае, если у меня нет $handler->gc($maxlifetime); в index.php) после закрытия браузера (т.е. 11), обновления index.php и проверки моей таблицы сеансов mysql? Пожалуйста, обратите внимание, что $maxlifetime 1 (второй).

спасибо с наилучшими пожеланиями

мой index.php

// populate inclusion paths
...

// mysql PDO connect
require_once("config.php");
$dbh = new PDO("mysql:host=$my_host;dbname=$my_db;charset=utf8", $my_username, $my_password);

// start session
require_once("class_Session.php");

$maxlifetime = 1; // seconds

$handler = new MySessionHandler($dbh, $maxlifetime);

session_set_save_handler(
array($handler, 'open'),
array($handler, 'close'),
array($handler, 'read'),
array($handler, 'write'),
array($handler, 'destroy'),
array($handler, 'gc')
);

// the following prevents unexpected effects when using objects as save handlers
register_shutdown_function('session_write_close');

session_start();

$_SESSION['user'] = 'joe';

if (isset($_SESSION['user'])) { echo $_SESSION['user']; }

// note if I try code below, expired rows are deleted
// $handler->gc($maxlifetime);

// some other irrelevant-to-this case codes
...

// close mysql connection
$dbh = NULL;

MySessionHandler класс

class MySessionHandler {

private $_db;
private $maxlifetime;

function __construct(PDO $dbh, $maxlifetime)
{
$this->_db = $dbh;
$this->maxlifetime = $maxlifetime;
return (TRUE);
}

function open()
{

}

function close()
{
$this->_db = NULL;

return (TRUE);
}

function read($id)
{
$query = "SELECT `data` FROM `sessions` WHERE id = ? LIMIT 1";
$this->read_stmt = $this->_db->prepare($query);
$this->read_stmt->bindParam(1, $id, PDO::PARAM_STR);
$this->read_stmt->execute();
$data = $this->read_stmt->fetchColumn();
return $data;
}

function write($id, $data)
{
$query = "REPLACE `sessions` (`id`, `data`) VALUES(?,?)";
$this->w_stmt = $this->_db->prepare($query);
$this->w_stmt->bindParam(1, $id, PDO::PARAM_STR);
$this->w_stmt->bindParam(2, $data, PDO::PARAM_STR);
$this->w_stmt->execute();

return (TRUE);
}

function destroy($id)
{
$query = "DELETE FROM `sessions` WHERE id = ?";
$this->delete_stmt = $this->_db->prepare($query);
$this->delete_stmt->bindParam(1, $id, PDO::PARAM_STR);
$this->delete_stmt->execute();

return (TRUE);
}

function gc($maxlifetime)
{
// instead of CURRENT_TIMESTAMP(), I also tried NOW() command
$query = "DELETE FROM `sessions` WHERE `update_time` < CURRENT_TIMESTAMP() - INTERVAL ? SECOND";
$this->gc_stmt = $this->_db->prepare($query);
$this->gc_stmt->bindParam(1, $this->maxlifetime, PDO::PARAM_STR);
$this->gc_stmt->execute();
return (TRUE);

}
}

связанный SQL для сессионный стол

CREATE TABLE `sessions`
(
`id` CHAR(32) NOT NULL,
`data` BLOB,
`update_time` TIMESTAMP NOT NULL,
PRIMARY KEY (id),
INDEX (update_time)
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]