使用数据库保存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 Mysql编程之高级技巧
Aug 27 PHP
php 正则表达式小结
Aug 31 PHP
关于PHP结束标签的使用细节探讨及联想
Mar 04 PHP
thinkPHP实现表单自动验证
Dec 24 PHP
PHP回溯法解决0-1背包问题实例分析
Mar 23 PHP
php实现TCP端口检测的方法
Apr 01 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
Oct 10 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
PHP 二维关联数组根据其中一个字段排序(推荐)
Apr 04 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
Laravel框架分页实现方法分析
Jun 12 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,ASP.JAVA,JAVA代码格式化工具整理
2010/06/15 PHP
PHP imagecreatefrombmp 从BMP文件或URL新建一图像
2012/07/16 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
推荐25款php中非常有用的类库
2014/09/29 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
js的表单操作 简单计算器
2011/12/29 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
node.js中的http.response.end方法使用说明
2014/12/14 Javascript
javascript实现连续赋值
2015/08/10 Javascript
基于javascript实现泡泡大冒险网页版小游戏
2016/03/23 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
谈谈JavaScript的New关键字
2016/08/26 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
详解JavaScript中js对象与JSON格式字符串的相互转换
2017/02/14 Javascript
详解A标签中href=&quot;&quot;的几种用法
2017/08/20 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
Vue数据监听方法watch的使用
2018/03/28 Javascript
JavaScript RegExp 对象用法详解
2019/09/24 Javascript
Vue 实现一个命令式弹窗组件功能
2019/09/25 Javascript
python获取文件扩展名的方法
2015/07/06 Python
使用python在本地电脑上快速处理数据
2017/06/22 Python
对web.py设置favicon.ico的方法详解
2018/12/04 Python
pandas将list数据拆分成行或列的实现
2020/12/13 Python
使用CSS3来绘制一个月食图案
2015/07/18 HTML / CSS
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
环境科学专业研究生求职信
2013/10/02 职场文书
如何填写个人简历自我评价
2013/12/10 职场文书
母亲节感恩寄语
2014/02/21 职场文书
社区道德讲堂实施方案
2014/03/21 职场文书
语文教育专业求职信
2014/06/28 职场文书
中学生社会实践活动总结
2014/07/03 职场文书
2014年群众路线党员自我评议
2014/09/24 职场文书
瘦西湖导游词
2015/02/03 职场文书