我目前有一个包含session_set_saver_handler
它工作正常的类。但是我想实现一个会话超时,这会导致比最初预期的更多的问题。
据我所知,会话生命周期如下;
- 打开
- 读
- 写
- 关
然后调用session_destroy()
将运行_destroy()
,这将运行我设置的配置。
该类直接写入数据库以存储我的会话。该数据库包含以下列;
- 会议; 包含 sessionID
- 数据; 包含会话的数据
- 更新时间;包含会话的最后一个活动
- 锁定;默认为假。但是,如果
$variable
<$access
这设置为 true
所以,目前我有以下内容;
public function _read($id)
{
$timeout = time() - 30;
$this->database->query('SELECT updatedTime, data FROM sessions WHERE session = :id');
$this->database->bind(':id', $id);
if($this->database->execute())
{
if($this->database->rowCount() > 0)
{
$row = $this->database->singleResult();
if($row['updatedTime'] < $timeout)
{
session_unset();
session_destroy();
return;
}
return $row['data'];
}
}
return '';
}
public function _destroy($id)
{
$locked = true;
$this->database->query('UPDATE sessions SET locked = :locked WHERE session = :id');
$this->database->bind(':locked', $locked);
$this->database->bind(':id', $id);
if($this->database->execute())
{
return true;
}
return false;
}
但是,当条件为真 ( $row['updatedTime'] < $timeout
) 时,它会运行session_destroy
,因为它依赖于传递给类的数据库对象,这在session_destroy
运行时会被破坏,这意味着没有活动的数据库连接。好吧,据我所知,这是正在发生的事情。我可能完全理解错了。
30 秒超时仅用于测试目的。好的,所以我要的是当会话的最后一个活动超过当前设置的超时时,它需要销毁会话并将locked
列设置为true
.
谢谢!