session存入数据库
[1] nsession.sql
create table mysession( session_key char(32) not null, session_data text, session_expiry int(11), primary key(session_key) );
[2] session_inc.php
<?php function mysession_open($save_path, $session_name) { //echo 'save_path '.$save_path.'<br />'; //echo 'session_name '.$session_name.'<br />'; @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器 or die("数据库服务器连接失败"); @mysql_select_db("test") or die("数据库不存在或不可用"); //选择数据库mydb return true; } function mysession_close() { return true; } function mysession_read($key) { //echo 'key '.$key.'<br />'; //@mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器 //or die("数据库服务器连接失败"); //@mysql_select_db("test") //选择数据库mydb //or die("数据库不存在或不可用"); $expiry_time = time(); //获取Session失效时间 //执行SQL语句获得Session的值 $query = @mysql_query("select session_data from mysession " ."where session_key = '$key' and session_expiry > $expiry_time") or die("SQL语句执行失败"); if($row = mysql_fetch_array($query)) return $row['session_data']; else return false; } function mysession_write($key, $data) { //echo 'write: '.$key.'<br />'; //echo 'data '.$data.'<br />'; // @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器 // or die("数据库服务器连接失败"); // @mysql_select_db("test") //选择数据库mydb // or die("数据库不存在或不可用"); $expiry_time = time() + 5; //获取Session失效时间 //查询Session的键值是否已经存在 $query = @mysql_query("select session_data from mysession " . "where session_key = '$key'") or die("SQL语句执行失败"); //如果不存在,则执行插入操作,否则执行更新操作 if(mysql_numrows($query) == 0) { //执行SQL语句插入Session的值 $query = @mysql_query("insert into mysession values('$key', '$data', $expiry_time)") or die("SQL语句执行失败"); } else { //执行SQL语句更新Session的值 $query = @mysql_query("update mysession set " ."session_data = '$data', session_expiry = $expiry_time " ."where session_key = '$key'") or die("SQL语句执行失败"); } return $query; } function mysession_destroy($key) { // @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器 // or die("数据库服务器连接失败"); // @mysql_select_db("test") //选择数据库mydb // or die("数据库不存在或不可用"); //执行SQL语句删除Session $query = @mysql_query("delete from mysession where session_key = '$key'") or die("SQL语句执行失败"); return $query; } function mysession_gc($expiry_time) { // echo "gc called "; // @mysql_connect("localhost", "root", "171084") //选择数据库之前需要先连接数据库服务器 // or die("数据库服务器连接失败"); // @mysql_select_db("test") //选择数据库mydb // or die("数据库不存在或不可用"); $expiry_time = time(); //执行SQL语句删除Session $query = @mysql_query("delete from mysession where session_expiry < $expiry_time") or die("SQL语句执行失败"); return $query; } // $domain = ''; //不使用 GET/POST 变量方式 ini_set('session.use_trans_sid', 0); //设置垃圾回收最大生存时间 ini_set('session.gc_maxlifetime', 5); //使用 COOKIE 保存 SESSION ID 的方式 //ini_set('session.use_cookies', 1); //ini_set('session.cookie_path', '/'); //多主机共享保存 SESSION ID 的 COOKIE //ini_set('session.cookie_domain', $domain); //设置用户自定义Session存储 ini_set('session.save_handler', 'user'); session_set_save_handler('mysession_open', 'mysession_close', 'mysession_read', 'mysession_write', 'mysession_destroy', 'mysession_gc'); ?>
[3] test.php
<?php include('session_inc.php'); //包含session_set_save_handler定义的文件 session_start(); $_SESSION['passed'] = true; echo $_SESSION['passed']; ?>
[4]
目前基本可用,但sess_gc没有被执行,不知为何。。。
sess_gc是按一定的概率被调用的。可以设置
session.gc_probability 与 session.gc_divisor 合起来用来管理 gc(garbage collection 垃圾回收)进程启动的概率。默认为 1。详见 session.gc_divisor。
session.gc_divisor与 session.gc_probability 合起来定义了在每个会话初始化时启动 gc(garbage collection 垃圾回收)进程的概率。此概率用 gc_probability/gc_divisor 计算得来。例如 1/100 意味着在每个请求中有 1% 的概率启动 gc 进程。session.gc_divisor 默认为 100。
ini_set('session.gc_probability', 50);
ini_set('session.gc_divisor', 100);
还发现PHP牛的一点,如果客户端禁用cookie,只要ini_set('session.use_trans_sid', 1);
它会自动把session id 附在链接后。Session 就可以正常使用了。