编辑:4 我去了,并试用了常规会话处理程序,同样的问题可能是一些操作系统错误?PHP session_regenerate_id(true)不工作,因为它应该
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(真)
布尔session_regenerate_id某种原因([布尔$ delete_old_session = false])
因此,预期的行为是产生一个新的会话,然后删除旧的
如果我执行它通常我有正确的行为...
输出:
d5ips18ji4rg7q63skuf7955b4
udk903d5o2nbeoq5soujng0bp5
http://s7.postimg.org/67dbyv3x7/image.png
但如果我重新加载页面多次,(保持按下F5的一对夫妇在o秒......) 它创造了超过60会话
http://s7.postimg.org/442wr744b/image.png
我不知道,如果im实现这个正确。 ..
编辑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;
}
}
我甚至tryied这种方法insted的的定期sess_reg_id(真)
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:
bool session_regenerate_id([bool $ delete_old_session = false]) delete_old_session 是否删除旧的关联会话文件。 –
可能是你的'destroy'回调实现中的缺陷? –
我已经编辑了这篇文章,并在其中加入了破坏 –