编辑:4 我去尝试使用常规会话处理程序,同样的问题可能是一些操作系统错误吗?
session_start();
$_SESSION['h0']=5;
session_regenerate_id(true);
再次重新加载页面时,您将获得所有具有相同数据的A LOT会话。
出于某种原因执行此脚本时
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: 我知道我可以找到解决方法,但我很想知道为什么这么多会话! d: 的
答案 0 :(得分:0)
您可能正在将PHP的默认会话机制与您的框架或您自己的会话实现混合在一起。
$session->start_session(); // where does $session come from?
//and then
session_id();
是的,它正在以预期的方式运作。您正在每次重新加载页面时生成新的会话ID。因此,新生成的会话ID存储在数据库中。
仅在您需要时重新生成会话ID。您可能不需要在每次页面请求时生成它。