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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
隐性调用php程序的方法
Mar 09 PHP
php一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
选择PHP作为网站开发语言的原因分享
Jan 03 PHP
php的sprintf函数的用法 控制浮点数格式
Feb 14 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
PHP将session信息存储到数据库的类实例
Mar 04 PHP
PHP图像裁剪缩略裁切类源码及使用方法
Jan 07 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
Feb 23 PHP
PHP实现的装箱算法示例
Jun 23 PHP
laravel 数据验证规则详解
Oct 23 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 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类分享
2014/02/07 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
PHP获取毫秒级时间戳的方法
2015/04/15 PHP
php实现二叉树中和为某一值的路径方法
2018/10/14 PHP
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
javascript设计模式之工厂模式示例讲解
2014/03/04 Javascript
JQuery中extend使用介绍
2014/03/13 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
Js实现手机发送验证码时按钮延迟操作
2014/06/20 Javascript
基于NodeJS的前后端分离的思考与实践(六)Nginx + Node.js + Java 的软件栈部署实践
2014/09/26 NodeJs
使用js画图之画切线
2015/01/12 Javascript
JavaScript学习笔记之Cookie对象
2015/01/22 Javascript
react.js CMS 删除功能的实现方法
2017/04/17 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
JS中getElementsByClassName与classList兼容性问题解决方案分析
2019/08/07 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
2020/06/01 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
2020/08/28 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
Python实现一个服务器监听多个客户端请求
2018/04/12 Python
python求解数组中两个字符串的最小距离
2018/09/27 Python
python读写csv文件并增加行列的实例代码
2019/08/01 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python 实现客户端与服务端的通信
2020/12/23 Python
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
Europcar比利时:租车
2019/08/26 全球购物
Michael Kors香港官网:美国奢侈品品牌
2019/12/26 全球购物
咖啡店自主创业商业计划书
2014/01/22 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
初中家长评语大全
2014/12/26 职场文书
苏州园林导游词
2015/02/03 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
详细聊聊关于Mysql联合查询的那些事儿
2021/10/24 MySQL