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 相关文章推荐
类的另类用法--数据的封装
Oct 09 PHP
TMDPHP 模板引擎使用教程
Mar 13 PHP
探讨如何把session存入数据库
Jun 07 PHP
利用curl 多线程 模拟 并发的详解
Jun 14 PHP
关于PHP 如何用 curl 读取 HTTP chunked 数据
Feb 26 PHP
php显示页码分页类的封装
Jun 08 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
PHP实现创建微信自定义菜单的方法示例
Jul 14 PHP
PHP有序表查找之二分查找(折半查找)算法示例
Feb 09 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
Yii2.0 RESTful API 基础配置教程详解
Dec 26 PHP
PHP htmlentities()函数用法讲解
Feb 25 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
Zerg剧情介绍
2020/03/14 星际争霸
phpmyadmin 访问被拒绝的真实原因
2009/06/15 PHP
PHP中的插件机制原理和实例
2014/07/08 PHP
php简单实现屏蔽指定ip段用户的访问
2015/04/29 PHP
Smarty最简单实现列表奇偶变色的方法
2015/07/01 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
php实现简单加入购物车功能
2017/03/07 PHP
js同比例缩放图片的小例子
2013/10/30 Javascript
jquery滚动到顶部底部代码
2015/04/20 Javascript
javascript框架设计之类工厂
2015/06/23 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
[03:39]DOTA2英雄梦之声_第05期_幽鬼
2014/06/23 DOTA
Python处理RSS、ATOM模块FEEDPARSER介绍
2015/02/18 Python
初学Python函数的笔记整理
2015/04/07 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
Python设计模式之解释器模式原理与用法实例分析
2019/01/10 Python
python找出因数与质因数的方法
2019/07/25 Python
使用OpenCV-python3实现滑动条更新图像的Canny边缘检测功能
2019/12/12 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
阿迪达斯比利时官方商城:adidas比利时
2016/10/10 全球购物
番木瓜健康和保健产品第一大制造商:Herbal Papaya
2017/04/25 全球购物
入党转预备思想汇报
2014/01/07 职场文书
2014年小学元旦活动方案
2014/02/12 职场文书
电钳工人个人求职信
2014/05/10 职场文书
校园文明倡议书
2014/05/16 职场文书
毕业实习指导教师评语
2014/12/31 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
初中体育课教学反思
2016/02/16 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
python数据处理之Pandas类型转换
2022/04/28 Python