使用数据库保存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 相关文章推荐
第二节 对象模型 [2]
Oct 09 PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 PHP
smarty简单入门实例
Nov 28 PHP
php匹配字符中链接地址的方法
Dec 22 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
Dec 02 PHP
PHP常用算法和数据结构示例(必看篇)
Mar 15 PHP
Laravel框架实现定时发布任务的方法
Aug 16 PHP
PHP children()函数讲解
Feb 03 PHP
PHP echo()函数讲解
Feb 15 PHP
实现laravel 插入操作日志到数据库的方法
Oct 11 PHP
微信小程序和php的登录实现
Apr 01 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程序
2006/10/09 PHP
PHP调用wsdl文件类型的接口代码分享
2014/11/19 PHP
ThinkPHP实现图片上传操作的方法详解
2017/05/08 PHP
JS对HTML标签select的获取、添加、删除操作
2013/10/17 Javascript
JavaScript中的立即执行函数表达式介绍
2015/03/15 Javascript
jQuery中数据缓存$.data的用法及源码完全解析
2016/04/29 Javascript
jQuery实现的小图列表,大图展示效果幻灯片示例
2016/10/25 Javascript
简单谈谈ES6的六个小特性
2016/11/18 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
vuex中使用对象展开运算符的示例
2017/09/25 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
Vue 之孙组件向爷组件通信的实现
2019/04/23 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
vue渲染方式render和template的区别
2020/06/05 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
Python中使用hashlib模块处理算法的教程
2015/04/28 Python
python实现逻辑回归的方法示例
2017/05/02 Python
python 从文件夹抽取图片另存的方法
2018/12/04 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
家长会演讲稿范文
2014/01/10 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
小学二年级评语
2014/04/21 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
2014年酒店前台工作总结
2014/11/14 职场文书
先进个人自荐书
2015/03/06 职场文书
2015年学校体育工作总结
2015/04/22 职场文书
离婚上诉状范文
2015/05/23 职场文书
爱护公物主题班会
2015/08/17 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python