почему идентификатор сессии часто меняется?

Я установил хранение сессий в базе данных. Когда я звоню session_destroy ищет конкретные session_id в базе данных, чтобы удалить его.

Поскольку идентификатор сеанса часто меняется, новый идентификатор_ сеанса не совпадает с идентификатором сеанса db, который был сохранен ранее, поэтому данные этих сеансов не удаляются. Даже gc тоже не работает. Все данные сеанса сохраняются в базе данных, но не уничтожаются.

DbSessionHandler.php

class DbSessionHandler implements SessionHandlerInterface{

public $dbconnect;
public function __construct($db){
$this->dbconnect=$db;
session_set_save_handler(
array($this, 'open'),
array($this, 'close'),
array($this, 'read'),
array($this, 'write'),
array($this, 'destroy'),
array($this, 'gc')
);
register_shutdown_function(session_write_close());
session_start();
}

//make sure whether db connection is successfull
public function open($savepath, $id)
{
return $this->dbconnect ? true : false;
}

public function close()
{
return true;
}

//read from database based on id, always return a string even if it is empty
public function read($id)
{
$data = "";   //declare empty string, if no data found, can return this empty string
$session_row = $this->dbconnect->prepare("select session_data from session_store where session_id=:id");
$session_row->execute(array(":id" => $id));
if ($session_row->rowCount() > 0) {
$datas = $session_row->fetch();
$data=$datas["session_data"];
}
return $data;

}

/**
* Write session_data using replace query (which does either insert or update)
*/
public function write($id, $data)
{
if(!(empty($data))) {
$time = time();
$session_write = $this->dbconnect->prepare("REPLACE INTO session_store VALUES(:id,:data,:expire)");
if ($session_write->execute(array(":id" => $id, ":data" => $data, ":expire" => $time))) {
return true;
}
}
return false;
}

/**
* Destroy
*/
public function destroy($id)
{
$destroy = $this->dbconnect->prepare("delete from session_store where session_id = :id");
if ($destroy->execute(array(":id" => $id))) {
return true;
}
return false;
}

/**
* Garbage Collection
*/
public function gc($max)
{
//Delete all records who have passed the expiration time
$time=time();
$delete = $this->dbconnect->prepare("delete from session_store where session_expire < :oldtime");
if ($delete->execute(array(":oldtime" => $time - $max))) {
return true;
}
return false;
}

}

PHP-файл, который запускает сессию:

function initiate_session()
{
$session_hash = 'sha512';
$session_name = 'some_name';
$secure = false;
$httponly = true;
ini_set('session.use_only_cookies', 1);
ini_set('session.hash_function', $session_hash);
ini_set('session.hash_bits_per_character', 5);
$cookieParams = session_get_cookie_params();
session_set_cookie_params($cookieParams['lifetime'], $cookieParams['path'], $cookieParams['domain'], $secure, $httponly);
session_name($session_name);
new DbSessionHandler(db_connect());

}

идентификатор сессии

На этом изображении вы можете видеть, что session_id в таблице и session_id в сценарии отличаются, что делает данные сеанса в базе данных не удаляемыми.

1

Решение

попробуйте использовать это
session_regenerate_id (истина);

Передав TRUE логическое значение, вы уничтожите старый идентификатор сессии, а создадите другой.
Вы можете добавить это в функцию initiate_session ().

-1

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

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

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