编辑: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:我知道我可以找到解决方法,但我很想知道为什么要创建这么多会话!丁: