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第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
Jul 01 PHP
php如何调用webservice应用介绍
Nov 24 PHP
PHP图片等比例缩放生成缩略图函数分享
Jun 10 PHP
PHP中exec函数和shell_exec函数的区别
Aug 20 PHP
php树型类实例
Dec 05 PHP
php curl登陆qq后获取用户信息时证书错误
Feb 03 PHP
教大家制作简单的php日历
Nov 17 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
Nov 18 PHP
Laravel框架验证码类用法实例分析
Sep 11 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 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 MYSQL 数据备份类
2009/06/19 PHP
谈谈新手如何学习PHP 默默经典版本
2009/08/04 PHP
PHP+MySQL 手工注入语句大全 推荐
2009/10/30 PHP
利用PHP脚本在Linux下用md5函数加密字符串的方法
2015/06/29 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
js 弹出菜单/窗口效果
2011/10/30 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
html文件中jquery与velocity变量中的$冲突的解决方法
2013/11/01 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
Angular 组件之间的交互的示例代码
2018/03/24 Javascript
vue2.0实现移动端的输入框实时检索更新列表功能
2018/05/08 Javascript
使用taro开发微信小程序遇到的坑总结
2019/04/08 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
vue.js click点击事件获取当前元素对象的操作
2020/08/07 Javascript
[00:48]食人魔魔法师至宝“金鹏之幸”全新模型和自定义特效展示
2019/12/19 DOTA
python出现&quot;IndentationError: unexpected indent&quot;错误解决办法
2017/10/15 Python
python实现读取大文件并逐行写入另外一个文件
2018/04/19 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
CSS3下的渐变文字效果实现示例
2018/03/02 HTML / CSS
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
优秀老师事迹材料
2014/02/05 职场文书
采购经理岗位职责
2014/02/16 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
骨干教师培训方案
2014/05/06 职场文书
青春励志演讲稿范文
2014/08/25 职场文书
焦裕禄观后感
2015/06/03 职场文书
公司酒会主持词
2015/07/02 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
vue3中provide && inject的使用
2021/07/01 Vue.js