数据库中的PHP会话

时间:2012-06-30 07:42:47

标签: php database session

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

 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

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

3 个答案:

答案 0 :(得分:1)

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

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

  2. 您可能另外考虑的另一种方法是使用CHRON Job或其他自动运行的脚本,每隔一段时间运行一次,以清除会话表中过期的条目。如果您的网站收到轻微和不经常的流量,这是一个很好的方法。

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

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

答案 1 :(得分:0)

看看HTTP_Session2。来自PEAR文档:

  

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

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

答案 2 :(得分:-2)

在代码session_destroy();结束时关闭会话:

<?php
    session_destroy();
?>