`
liu86th
  • 浏览: 118384 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

    博客分类:
  • PHP
 
阅读更多

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

分享到:
评论

相关推荐

    php中将session保存到数据库的函数类代码.zip

    总的来说,将PHP的Session保存到数据库是一种增强Session管理的有效方式。通过编写一个自定义的处理器类并使用`session_set_save_handler()`函数,我们可以确保Session数据的安全性和可靠性,同时还能根据项目需求...

    php中将session保存到数据库的函数类代码

    标题所提及的"php中将session保存到数据库的函数类代码",就是用来实现这一功能的。这种自定义Session处理方式通常通过`session_set_save_handler()`函数来完成,该函数允许我们注册自定义的Session存储和恢复的...

    Session保存到数据库的php类分享

    本文介绍了一个用于将PHP Session保存到数据库的PHP类。这个类可以帮助开发者将用户的会话数据存储在数据库中,而不是像默认情况下存储在文件或临时目录中。这样的做法在分布式应用或负载均衡环境下尤其有用,因为它...

    php.itcast.cn PHP课程-利用read和write将session的数据保存到数据库内

    本课程“php.itcast.cn PHP课程-利用read和write将session的数据保存到数据库内”就详细讲解了如何实现这一目标。 首先,我们需要了解PHP的Session处理流程。当用户访问一个启用session的PHP页面时,PHP会生成一个...

    session模拟数据库实现用户登录功能

    4. 客户端保存session ID:浏览器收到响应后,会保存这个session ID(通常作为cookie),并在之后的每次请求中自动带上。 5. 检查session状态:之后,每当用户访问受保护的页面时,服务器会检查请求中的session ID...

    将PHP的session数据存储到数据库中的代码实例

    总结来说,这些代码实例为如何将PHP session数据存储到数据库提供了一套完整的解决方案,包含了数据库的表结构设计、存储过程以及PHP的自定义session处理函数。这些做法在需要高度扩展性和跨服务器session共享的环境...

    php中使用session_set_save_handler()函数把session保存到MySQL数据库实例

    另一方面,如果服务器起采用群集的方式的话就不能保持session的一致性,所以我们就绪要采用数据库的方式来保存session,这样,不管有几台服务器同时使用,只要把他们的session保存在一台数据库服务器上就可以保证...

    php从入门到精通第二版中的第十一章cookie与session存入数据库的源码测试

    在这个过程中,`read()`和`write()`函数是核心,它们负责与数据库交互,读取和保存Session数据。`gc()`函数则用于定期清理数据库中过期的Session记录,以保持数据库的整洁。 总结来说,Cookie和Session是PHP中处理...

    SESSION存放在数据库用法实例

    3. `session_data`:保存了session变量的实际数据,是一个文本字段,可以存储任何序列化后的PHP数据结构。 接下来,定义一个名为`session`的类,它实现了PHP的Session Handler接口。这个类有以下方法: 1. `open()...

    PHP+MYSQL+SESSION实现简单购物车类数据库文件

    4. **持久化购物车**:每次购物车操作后,可以将SESSION内容同步到数据库的`cart_items`表,以防止SESSION丢失(如用户关闭浏览器)。 5. **结账**:用户确认购物车内容后,进行结算操作,这可能涉及计算总价、检查...

    PHP中session全面教程.txt

    1. **Session ID**: 当用户访问网站时,服务器会创建一个唯一的Session ID,并通过Cookie的形式存储到客户端。这个Session ID将作为识别特定用户的唯一标识。 2. **Session存储**: 服务器端为每个用户创建一个...

    PHP的session基础

    **PHP的Session基础** 在Web开发中,PHP的Session机制是一种非常重要的用户状态...在实际项目中,还需考虑Session的存储方式(默认为文件系统,也可以配置为数据库)、Session超时设置以及防止Session劫持的安全措施。

    php session操作类

    1. **初始化Session**:类中可能会有一个初始化方法,用于开启Session并设置默认配置,例如设置Session保存路径、生命周期、是否使用cookie等。 2. **设置Session值**:类可能会提供一个`set_session_data`方法,...

    PHP封装的数据库保存session功能类

    【PHP封装的数据库保存session功能类】是一种将用户会话数据存储在数据库中的技术实践,以提高会话管理的安全性和可扩展性。在PHP中,session通常默认存储在服务器的临时文件系统中,但这种方式存在一些缺点,如数据...

    PHP Session的配置与应用

    如果浏览器支持Cookie,Session ID就会被自动发送回服务器,使得服务器能够识别并恢复之前保存的会话数据。 二、配置PHP Session 1. **启动Session**:在PHP代码中,必须先调用`session_start()`函数来开启一个新...

    php注册与登录小Demo_session_数据库_管理员与用户

    这个"php注册与登录小Demo"展示了如何利用PHP、session以及数据库来实现这一功能,同时区分管理员和普通用户。这里我们将深入探讨相关知识点。 1. **PHP Session**: PHP session是用于在用户浏览器会话之间存储...

    PHP将session信息存储到数据库的类实例

    在类MySessionHandler中,我们看到几个私有属性,包括数据库连接对象$dbLink,保存Session的表名$_sessionTable,以及Session名$_sessionName。此外,还定义了一个常量SESSION_EXPIRE,表示Session的过期时间。 ...

    php实现将Session写入数据库

    在本文中,我们主要讨论了使用PHP语言将Session数据存储到MySQL数据库的过程。这涉及到PHP的内置函数session_set_save_handler(),它允许用户自定义Session的存储方式。通过创建一个类Session,我们能够处理session...

Global site tag (gtag.js) - Google Analytics