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 相关文章推荐
深入php 正则表达式的学习探讨
Jun 06 PHP
php.ini修改php上传文件大小限制的方法详解
Jun 17 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 PHP
ThinkPHP模板比较标签用法详解
Jun 30 PHP
getimagesize获取图片尺寸实例
Nov 15 PHP
PHP中mysql_field_type()函数用法
Nov 24 PHP
php在线解压ZIP文件的方法
Dec 30 PHP
php+xml实现在线英文词典之添加词条的方法
Jan 23 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
如何解决PHP获取不到SESSION信息之一般情况
Oct 10 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 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实现采集中国天气网未来7天天气
2014/10/15 PHP
PHP的mysqli_rollback()函数讲解
2019/01/23 PHP
Yii 框架使用数据库(databases)的方法示例
2020/05/19 PHP
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
Ubuntu 11.10 安装Node.js的方法
2011/11/30 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
JS实现队列与堆栈的方法
2016/04/21 Javascript
微信小程序 特效菜单抽屉效果实例代码
2017/01/11 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
2017/08/19 Javascript
原生javascript实现的全屏滚动功能示例
2017/09/19 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
深入浅析Vue中的Prop
2018/06/10 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
Vue+Java+Base64实现条码解析的示例
2020/09/23 Javascript
[03:14]辉夜杯主赛事 12月25日每日之星
2015/12/26 DOTA
初步探究Python程序的执行原理
2015/04/11 Python
Python类的动态修改的实例方法
2017/03/24 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
Python 面试中 8 个必考问题
2018/11/16 Python
基于Python2、Python3中reload()的不同用法介绍
2019/08/12 Python
Python爬虫运用正则表达式的方法和优缺点
2019/08/25 Python
Python利用matplotlib绘制约数个数统计图示例
2019/11/26 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
python统计文章中单词出现次数实例
2020/02/27 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
创意活动策划书
2014/01/15 职场文书
骨干教师培训感言
2014/01/16 职场文书
应届毕业生如何写求职信
2014/02/16 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
2014年个人售房协议书
2014/10/30 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS