PHP用mysql数据库存储session的代码


Posted in PHP onMarch 05, 2010

隐患一:如果客户端机器的cookie一旦因病毒而失效了,那么session也就相当于没有了。
隐患二:session在php中默认的是以文件的形式保存在一个临时文件夹里面的,对于一个小型系统来说,这样做完全可以,
可是对于一个大型而又被经常访问的系统来说,就不是很好的办法了。假设这个网站一天有1000个人访问。一个月以后session的临时文件夹就会有30000个临时文件。想象一下计算机要从30000里面找一条session_sid是一个多么漫长的事情呀!
因此为了提高效率。
交易使用用数据库保存session。具体方法如下:
1.更改php.ini文件。
由于php默认保存session的方式是files所以我们要改变它。即:找到“session.save_handler = files”将“files”改为“User”。
把session的模式改成用户自定义的。
2.建立数据库:
CREATE TABLE `db_session` (
`sesskey` char(32) NOT NULL,
`expiry` int(11) unsigned NOT NULL,
`value` text NOT NULL,
PRIMARY KEY (`sesskey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
[/code]
数据库表明:db_session
列名:sesskey,expiry,value 其中:sesskey为主键。
Value里面存放着session里面的值。
3.建立session_mysql.php文件。这个文件是用来构造保存session的方法的。修改一下参数直接使用就可以了。
session_mysql.php
PHP代码:

<?php 
$gb_DBname="db_myBBS";//数据库名称 
$gb_DBuser="root";//数据库用户名称 
$gb_DBpass="23928484";//数据库密码 
$gb_DBHOSTname="localhost";//主机的名称或是IP地址 
$SESS_DBH=""; 
$SESS_LIFE=get_cfg_var("session.gc_maxlifetime");//得到session的最大有效期。 
function sess_open($save_path,$session_name){ 
global $gb_DBHOSTname,$gb_DBname,$gb_DBuser,$gb_DBpass,$SESS_DBH; 
if(!$SESS_DBH=mysql_pconnect($gb_DBHOSTname,$gb_DBuser,$gb_DBpass)){ 
echo "<li>MySql Error:".mysql_error()."<li>"; 
die(); 
} 
if(!mysql_select_db($gb_DBname,$SESS_DBH)){ 
echo "<li>MySql Error:".mysql_error()."<li>"; 
die(); 
} 
return true; 
} 
function sess_close(){ 
return true; 
} 
function sess_read($key){ 
global $SESS_DBH,$SESS_LIFE; 
$qry="select value from db_session where sesskey = '$key' and expiry > ".time(); 
$qid=mysql_query($qry,$SESS_DBH); 
if(list($value)=mysql_fetch_row($qid)){ 
return $value; 
} 
return false; 
} 
function sess_write($key,$val){ 
global $SESS_DBH,$SESS_LIFE; 
$expiry=time()+$SESS_LIFE; 
$value=$val; 
$qry="insert into db_session values('$key',$expiry,'$value')"; 
$qid=mysql_query($qry,$SESS_DBH); 
if(!$qid){ 
$qry="update db_session set expiry=$expiry, value='$value' where sesskey='$key' and expiry >".time(); 
$qid=mysql_query($qry,$SESS_DBH); 
} 
return $qid; 
} 
function sess_destroy($key){ 
global $SESS_DBH; 
$qry="delete from db_session where sesskey = '$key'"; 
$qid=mysql_query($qry,$SESS_DBH); 
return $qid; 
} 
function sess_gc($maxlifetime){ 
global $SESS_DBH; 
$qry="delete from db_session where expiry < ".time(); 
$qid=mysql_query($qry,$SESS_DBH); 
return mysql_affected_rows($SESS_DBH); 
} 
session_module_name(); 
session_set_save_handler("sess_open","sess_close","sess_read","sess_write","sess_destroy","sess_gc"); 
?>

4.建立测试文件。
在使用之前必须引用刚刚建立的session_mysql.php文件。
session_test.php
PHP代码:
<?php 
include ("session_mysql.php"); 
session_start(); 
$_SESSION['abc']= "A: I will be back!"; 
$_SESSION['meto']= "B: Me too "; 
$_SESSION['name']= "louis "; 
echo "<a href=\"get_session_test.php\">click me</a>"; 
?>

get_session_test.php
<?php 
include ("session_mysql.php"); 
session_start(); 
echo $_SESSION['abc']; 
echo "<br>"; 
echo $_SESSION['meto']; 
echo "<br>"; 
echo $_SESSION['name']; 
$_SESSION['wq']="12e"; 
echo "<br><a href=\"get_session_test2.php\">click again</a>"; 
?>

get_session_test2.php
<?php 
include ("session_mysql.php"); 
session_start(); 
echo $_SESSION['abc']; 
echo "<br>"; 
echo $_SESSION['meto']; 
echo "<br>"; 
echo $_SESSION['name']; 
echo "<br>"; 
echo $_SESSION['wq']; 
//session_destroy();//用来销毁所有session的函数。 
?>
PHP 相关文章推荐
超强分页类2.0发布,支持自定义风格,默认4种显示模式
Jan 02 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
codeigniter教程之上传视频并使用ffmpeg转flv示例
Feb 13 PHP
PHP 快速排序算法详解
Nov 10 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
php框架CodeIgniter使用redis的方法分析
Apr 13 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
解决thinkphp6(tp6)在状态码500下不报错,或者显示错误“Malformed UTF-8 characters”的问题
Apr 01 PHP
PHP 采集程序原理分析篇
Mar 05 #PHP
PHP 一个页面执行时间类代码
Mar 05 #PHP
一步一步学习PHP(8) php 数组
Mar 05 #PHP
一步一步学习PHP(7) php 字符串相关应用
Mar 05 #PHP
PHP 创建文件(文件夹)以及目录操作代码
Mar 04 #PHP
php &amp;&amp; 逻辑与运算符使用说明
Mar 04 #PHP
PHP MVC模式在网站架构中的实现分析
Mar 04 #PHP
You might like
php 动态添加记录
2009/03/10 PHP
深入php常用函数的使用汇总
2013/06/08 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
javascript实现的网页局布刷新效果
2008/12/01 Javascript
JavaScript中各种编码解码函数的区别和注意事项
2010/08/19 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
如何防止JavaScript自动插入分号
2015/11/05 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
JS实现拖拽的方法分析
2016/12/20 Javascript
微信小程序 数据遍历的实现
2017/04/05 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
微信小程序3种位置API的使用方法详解
2019/08/05 Javascript
解决vue单页面 回退页面 keeplive 缓存问题
2020/07/22 Javascript
[03:18]DOTA2亚洲邀请赛小组赛第一日 RECAP赛事回顾
2015/01/30 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
python实现批量下载新浪博客的方法
2015/06/15 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python如何为被装饰的函数保留元数据
2018/03/21 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
详解pycharm连接不上mysql数据库的解决办法
2020/01/10 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
python实现简单的五子棋游戏
2020/09/01 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
购买原创艺术品:Zatista
2019/11/09 全球购物
医科大学生的自我评价
2013/12/04 职场文书
数学系毕业生的自我评价
2014/01/10 职场文书
打架检讨书400字
2014/01/17 职场文书
活动总结怎么写啊
2014/05/07 职场文书
2014年学生管理工作总结
2014/12/20 职场文书
Python Flask实现进度条
2022/05/11 Python