[php] 设置session保存到数据库

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 就可以正常使用了。

你可能感兴趣的:(session)