使用数据库保存session的方法


Posted in PHP onOctober 09, 2006

php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler,同时要将php.ini里的session.save_handler = files 改为 user。这里我们讨论的环境是linux(freesd)+apache+mysql+php。

数据表结构:[sessions]
CREATE TABLE sessions (  
sesskey char(32) not null,  
expiry int(11) unsigned not null,  
value text not null,  
PRIMARY KEY (sesskey)  
);

程序代码:[session_inc.php]
<?php
$SESS_DBHOST = "yourhost"; /* database server hostname */
$SESS_DBNAME = "yourdb"; /* database name */
$SESS_DBUSER = "youruser"; /* database user */
$SESS_DBPASS = "yourpassword"; /* database password */

$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");

function sess_open($save_path, $session_name) {
    global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;

    if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS)) {
        echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER";
        echo "<li>MySQL Error: " . mysql_error();
        die;
    }

    if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) {
        echo "<li>Unable to select database $SESS_DBNAME";
        die;
    }

    return true;
}

function sess_close() {
    return true;
}

function sess_read($key) {
    global $SESS_DBH, $SESS_LIFE;

    $qry = "SELECT value FROM session_tbl 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 = addslashes($val);

    $qry = "INSERT INTO session_tbl VALUES ('$key', $expiry, '$value')";
    $qid = mysql_query($qry, $SESS_DBH);

    if (! $qid) {
        $qry = "UPDATE session_tbl 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 session_tbl WHERE sesskey = '$key'";
    $qid = mysql_query($qry, $SESS_DBH);

    return $qid;
}

function sess_gc($maxlifetime) {
    global $SESS_DBH;

    $qry = "DELETE FROM session_tbl WHERE expiry < " . time();
    $qid = mysql_query($qry, $SESS_DBH);

    return mysql_affected_rows($SESS_DBH);
}

session_set_save_handler(
"sess_open",
"sess_close",
"sess_read",
"sess_write",
"sess_destroy",
"sess_gc");

session_start();
?>

完成以上步骤后,在程序中使用require("session_inc.php")来代替session_start()即可,其他的session函数还是象以前一样的方法调用。

【本文版权归作者与奥索网共同拥有,如需转载,请注明作者及出处】    

PHP 相关文章推荐
一些常用的php简单命令代码集锦
Sep 24 PHP
用js进行url编码后用php反解以及用php实现js的escape功能函数总结
Feb 08 PHP
PHP异步调用socket实现代码
Jan 12 PHP
探讨Hessian在PHP中的使用分析
Jun 13 PHP
php实现加减法验证码代码
Feb 14 PHP
ioncube_loader_win_5.2.dll的错误解决方法
Jan 04 PHP
php绘制一个扇形的方法
Jan 24 PHP
thinkphp实现图片上传功能
Jan 13 PHP
PHP编程计算日期间隔天数的方法
Apr 26 PHP
如何利用预加载优化Laravel Model查询详解
Aug 11 PHP
PHP简单验证码功能机制实例详解
Mar 27 PHP
如何通过PHP实现Des加密算法代码实例
May 09 PHP
COM in PHP (winows only)
Oct 09 #PHP
Banner程序
Oct 09 #PHP
下载文件的点击数回填
Oct 09 #PHP
PHP编程之高级技巧——利用Mysql函数
Oct 09 #PHP
动态生成gif格式的图像要注意?
Oct 09 #PHP
vBulletin HACK----显示话题大小和打开新窗口于论坛索引页
Oct 09 #PHP
利用递归把多维数组转为一维数组的函数
Oct 09 #PHP
You might like
PHP定时自动生成静态HTML的实现代码
2010/06/20 PHP
php上传图片存入数据库示例分享
2014/03/11 PHP
PHP正则+Snoopy抓取框架实现的抓取淘宝店信誉功能实例
2017/05/17 PHP
一页面多XMLHttpRequest对象
2007/01/22 Javascript
jQuery与ExtJS之选择实例分析
2010/08/19 Javascript
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
用js一次改变多个input的readonly属性值的方法
2014/06/11 Javascript
JavaScript中Cookie操作实例
2015/01/09 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
浅谈document.write()输出样式
2015/05/07 Javascript
AngularJs 延时器、计时器实例代码
2017/09/16 Javascript
vue-cli + sass 的正确打开方式图文详解
2017/10/27 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
python控制台显示时钟的示例
2014/02/24 Python
python中while循环语句用法简单实例
2015/05/07 Python
浅述python中argsort()函数的实例用法
2017/03/30 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
python机器学习理论与实战(五)支持向量机
2018/01/19 Python
利用Python如何生成便签图片详解
2018/07/09 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
使用python将最新的测试报告以附件的形式发到指定邮箱
2019/09/20 Python
Pyecharts地图显示不完成问题解决方案
2020/05/11 Python
django 解决扩展自带User表遇到的问题
2020/05/14 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
2015年女生节活动总结
2015/02/27 职场文书
python 实现两个变量值进行交换的n种操作
2021/06/02 Python
利用Python多线程实现图片下载器
2022/03/25 Python
Win11快速关闭所有广告推荐
2022/04/19 数码科技