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抓即时股票信息
Oct 09 PHP
php的list()的一步操作给一组变量进行赋值的使用
May 18 PHP
PHP的autoload机制的实现解析
Sep 15 PHP
php读取纯真ip数据库使用示例
Jan 26 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
php+ajax实现图片文件上传功能实例
Jun 17 PHP
php查看网页源代码的方法
Mar 13 PHP
PHP7.0版本备注
Jul 23 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
Mar 17 PHP
php简单统计在线人数的方法
May 10 PHP
PHP查询附近的人及其距离的实现方法
May 11 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
Jul 17 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短网址和数字之间相互转换的方法
2015/03/13 PHP
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
php远程下载类分享
2016/04/13 PHP
PHP聊天室简单实现方法详解
2018/12/08 PHP
Javascript 写的简单进度条控件
2008/01/22 Javascript
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
JS下高效拼装字符串的几种方法比较与测试代码
2010/04/15 Javascript
js中将字符串转换成json的三种方式
2011/01/12 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
使用jQuery实现WordPress中的Ctrl+Enter和@评论回复
2016/05/21 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
原生js封装自定义滚动条
2017/03/24 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
python 不关闭控制台的实现方法
2011/10/23 Python
由浅入深讲解python中的yield与generator
2017/04/05 Python
基于Django contrib Comments 评论模块(详解)
2017/12/08 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
Python 点击指定位置验证码破解的实现代码
2019/09/11 Python
python绘制规则网络图形实例
2019/12/09 Python
使用matplotlib绘制图例标签中带有公式的图
2019/12/13 Python
Mac PyCharm中的.gitignore 安装设置教程
2020/04/16 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
如何将PySpark导入Python的放实现(2种)
2020/04/26 Python
pytorch查看通道数 维数 尺寸大小方式
2020/05/26 Python
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
小学优秀教师先进事迹材料
2014/12/16 职场文书
财务部岗位职责
2015/02/03 职场文书
幼儿园家长工作总结2015
2015/04/25 职场文书
5种 JavaScript 方式实现数组扁平化
2021/10/05 Javascript
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫