1

编辑:4 我用常规会话处理程序尝试了这个,同样的问题可能是一些操作系统错误吗?

session_start();
$_SESSION['h0']=5;
session_regenerate_id(true);

同样,当多次重新加载页面时,您会得到很多会话都具有相同的数据。

由于某种原因,在执行此脚本时

define('endl', "<br>");
$session->start_session();
echo session_id().endl;
session_regenerate_id(true);
echo session_id().endl;

在顶部我正在使用 delete_old_session

session_regenerate_id(真)

bool session_regenerate_id ([ bool $delete_old_session = false ] )

所以预期的行为是生成一个新的会话,然后删除旧的

如果我正常执行它,我的行为是正确的......

输出:

d5ips18ji4rg7q63skuf7955b4
udk903d5o2nbeoq5soujng0bp5

http://s7.postimg.org/67dbyv3x7/image.png


但是,如果我多次重新加载页面,(按住 f5 几秒钟......)它会创建超过 60 个会话


http://s7.postimg.org/442wr744b/image.png

我不知道我是否正确实施了这个......

编辑 2:销毁回调

public function destroy($sessionId) {
    $qry = "DELETE FROM sessions WHERE id = :id";
    if (!isset($this->dStatement)) {
        $this->dStatement = $this->pdo->prepare($qry);
    }
    $this->dStatement->bindParam(':id', $sessionId, PDO::PARAM_INT);
    if ($this->dStatement->execute()) {
        return true;
    } else {
        echo "error destroy()";
        return false;
    }
}

我什至尝试过使用常规 sess_reg_id(true) 的这种方法

public function regen_id(){
    $sessionId = session_id();
    echo $sessionId;
    $qry = "INSERT INTO sessiondeletequeue VALUES (:id, 0)";
    if(!isset($this->regQuery)){
        $this->regQuery = $this->pdo->prepare($qry);
    }
    $this->regQuery->bindParam(':id', $sessionId, PDO::PARAM_STR);
    if($this->regQuery->execute()){
        session_regenerate_id();
        echo "<br>";
        $this->forceDelete();
        return true;
    }
    else{
        return false;
    }
}
private function forceDelete(){
    $qry = "SELECT id FROM sessiondeletequeue";
    foreach($this->pdo->query($qry) as $row){
        $this->destroy($row['id']);
        if(!isset($this->forceQuery)){
            $this->forceQuery = $this->pdo->prepare("UPDATE sessiondeletequeue SET deleted = 1 WHERE id = :id");
        }
        $this->forceQuery->bindParam(':id', $row['id'], PDO::PARAM_STR);
        $this->forceQuery->execute();
    }
    $this->pdo->query("DELETE FROM sessiondeletequeue WHERE deleted = 1 ");

编辑3:我知道我可以找到解决方法,但我很想知道为什么要创建这么多会话!丁:

4

1 回答 1

0

您可能将 PHP 的默认会话机制与您的框架或您自己的会话实现混为一谈。

$session->start_session(); // where does $session come from?
//and then
session_id();

是的,它正在以预期的方式工作。您在每次重新加载页面时都会生成一个新的会话 ID。因此,新生成的会话 ID 被存储在数据库中。

仅在需要时重新生成会话 ID。您可能不需要在对页面的每个请求都生成它。

于 2013-06-27T18:20:28.977 回答