【问题标题】:PHP sessions in Database [duplicate]数据库中的 PHP 会话 [重复]
【发布时间】:2012-07-01 14:41:13
【问题描述】:

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

 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

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

【问题讨论】:

  • 为什么不简单地序列化 $_SESSION 对象呢?

标签: php database session


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

    看看HTTP_Session2。来自 PEAR 文档:

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-03
      • 2011-07-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-26
      相关资源
      最近更新 更多