14

如何将会话存储在数据库中?我用这段代码做到了:

 function write ($session_id, $session_data)
// write session data to the database.
{
    if (!empty($this->fieldarray)) {
        if ($this->fieldarray['session_id'] != $session_id) {
            // user is starting a new session with previous data
            $this->fieldarray = array();
        } // if
    } // if

    if (empty($this->fieldarray)) {
        // create new record
        $array['session_id']   = $session_id;
        $array['date_created'] = getTimeStamp();
        $array['last_updated'] = getTimeStamp();
        $array['session_data'] = addslashes($session_data);
        $this->_dml_insertRecord($array);
    } else {
        // update existing record
        if (isset($_SESSION['logon_user_id'])) {
            $array['user_id']  = $_SESSION['logon_user_id'];
        } // if
        $array['last_updated'] = getTimeStamp();
        $array['session_data'] = addslashes($session_data);
        $this->_dml_updateRecord($array, $this->fieldarray);
    } // if

    return TRUE;

} // write

但是我应该如何像以前一样自动删除它。我的意思是如何在超时后自动删除会话?

4

2 回答 2

1

很久以前我不得不处理这个问题,有两个解决方案,这两个都不漂亮,但它就在这里。

  1. 按照事件的顺序(松散地),您的脚本将检查是否有会话 ID 发送到服务器,然后它将查看该会话是否在您的数据库中,以及该会话是否已过期。建立与会话数据库的连接后,您可能会考虑对过期日期超过当前时间戳的所有记录运行 DELETE 查询。然后搜索用户刚刚发送的ID。每次人们使用您的网站时,都会以这种方式进行清理

  2. 下一个方法,您可能会考虑另外做,是有一个 CHRON 作业或其他自动脚本,它经常运行以清除会话表中的过期条目。如果您的网站收到少量且不频繁的流量,这是一个很好的方法。

方法的组合是这样的。在验证会话时,在脚本中检查找到会话数据时的过期日期。如果找到 ID,但会话已过期,则删除会话并开始新的会话。如果您这样做,您将不必遇到太多 ID 冲突问题或大量查询减慢服务器速度。您仍然可以在每天结束时运行您的 chron 作业以运行完整的清理。

确保您的系统是否有某种类型的注销按钮,手动注销的行为将触发用户会话的删除。

于 2017-09-10T02:00:36.643 回答
0

看看HTTP_Session2。来自 PEAR 文档:

HTTP_Session2提供额外的功能,例如使用 DB 和 MDB2 包存储会话数据的数据库。它还引入了新的方法,例如 isNew()、useCookies()、setExpire()、setIdle()、isExpired()、isIdled() 等。

如果您想实现您的,请查看MDB2.php该包内的代码。它包含一个垃圾收集方法 (gc),结合session_set_save_handler应该可以解决问题。

于 2017-10-13T20:20:34.707 回答