关于session id销毁的问题,请教各位

php中文网
发布: 2016-06-23 13:49:35
原创
1556人浏览过

做一个简单的登录功能,用session_set_save_handler把session数据保存到数据库来管理
问题来了,同一个浏览器下当第一个用户登录的时候,正常,当第二个用户登录的时候我的做法是销毁先前的session,然后再创建一个session ,因为同一个浏览只允许一个 session id存在

一下是代码
function open($save_path, $session_name) {
    return(true);
}
function close() {
    return(true);
}
function read($id) {
$sql = "select * from session where sess_id='$id'";
    if ($result = mysql_query($sql)) {

        if ($row = mysql_fetch_array($result)) {
            return $row["session_data"];
        }
    } else {
        return "";
    }
}
function write($id, $sess_data) {
   $data_array = explode("username",$sess_data);
   $i = 0;   
   foreach ($data_array as $data_item){
   
      if($i == 1){   
      $data_array_sub = explode("\"",$data_item);
      $username = $data_array_sub[1];
      break;
     //  echo $username;
      }
      $i++;
   }
   if($username != null && strlen($username)>0){
       $con = mysql_connect("127.0.0.1", "root" , "111111");
       mysql_select_db("session");
       $sql = "update `session` set  `session_time`='".time()."',`session_data`='$sess_data' where `username`='$username' and `sess_id`='$id'";
     $result = mysql_query($sql);
   }
    if ($result==true) {
        return true;
    } else {
        return false;
    }
}
function destroy($id) {
    $sql = "update session set  sess_id='',session_data='' where  sess_id='$id'";
    if ($result = mysql_query($sql)) {
        return true;
    } else {
        return false;
    }
}
function gc($maxlifetime) {
    $sql = "update  `session` set sess_id='',session_data='' where unix_timestamp(now()) -`session_time` > '1800' and LENGTH(sess_id)>1";
    $result = mysql_query($sql);
    if ($result == true) {
        echo $sql;
        return true;
    } else {
        echo "error";
        return false;
    }

}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();
?>
//文件名是session_user_start.php
在login.php中的代码是


require_once "config/session_user_start.php";
$_SESSION['login']      = 1;
$_SESSION['id_user']    =11;
....login.php后面的代码省略

这样做是没有问题的

问题来了,因为session id一样,当第二个用户登录的时候我想将以前登录的session数据清除,就修改login.php如下
require_once "config/session_user_start.php";
session_unset();
session_destroy();
require_once "config/session_user_start.php";
$_SESSION['login']      = 1;
$_SESSION['id_user']    =11;
....login.php后面的代码省略

当销毁的时候destroy函数有调用,但是销毁过后login.php执行完调用write($id, $sess_data)的时候
$sess_data的值就是空了,第二个的session数据就写不进去了
session_unset();
session_destroy();这两句执行完以后重新再
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
session_start();不可以吗,为什么得不到数据呢,请教各位

补充一下
session_unset()
释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session id

session_destroy()
删除当前用户对应的session文件以及释放session id,内存中的$_SESSION变量内容依然保留
为什么销毁了,再调用session_start();session id的值还是一样的

AI建筑知识问答
AI建筑知识问答

用人工智能ChatGPT帮你解答所有建筑问题

AI建筑知识问答 22
查看详情 AI建筑知识问答

回复讨论(解决方案)

require_once "config/session_user_start.php";
已加载就不加载,所以无论你之后执行多少遍,都是无效的
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
只是绑定工作函数,与具体数据无关。多次执行也没什么意义
何况 php5.4 起,重复 session_start() 是要报错的

改变 sessionid 的值用 session_regenerate_id 函数

所以流程应是
require_once "config/session_user_start.php";
if(是新用户吗) {
  session_regenerate_id();
  $_SESSION 赋值操作
}
正常的验证操作

由于 sessionid 已经改变,原先的 sessionid 自然就失效了
清理由 gc 完成

require_once "config/session_user_start.php";
已加载就不加载,所以无论你之后执行多少遍,都是无效的
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
只是绑定工作函数,与具体数据无关。多次执行也没什么意义
何况 php5.4 起,重复 session_start() 是要报错的

改变 sessionid 的值用 session_regenerate_id 函数

所以流程应是
require_once "config/session_user_start.php";
if(是新用户吗) {
  session_regenerate_id();
  $_SESSION 赋值操作
}
正常的验证操作

由于 sessionid 已经改变,原先的 sessionid 自然就失效了
清理由 gc 完成


感谢
相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号