使用数据库保存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项目打包方法
Feb 18 PHP
PHP全概率运算函数(优化版) Webgame开发必备
Jul 04 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
探讨:parse url解析URL,返回其组成部分
Jun 14 PHP
PHP封装的一个支持HTML、JS、PHP重定向的多功能跳转函数
Jun 19 PHP
PHP使用gmdate实现将一个UNIX 时间格式化成GMT文本的方法
Mar 19 PHP
php生成txt文件实例代码介绍
Apr 28 PHP
PHP实现微信小程序人脸识别刷脸登录功能
May 24 PHP
PHP绕过open_basedir限制操作文件的方法
Jun 10 PHP
php压缩文件夹最新版
Jul 18 PHP
thinkPHP框架实现的简单计算器示例
Dec 07 PHP
PHP defined()函数的使用图文详解
Jul 20 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利用iframe实现无刷新文件上传功能的代码
2011/09/29 PHP
PHP输入流php://input介绍
2012/09/18 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
PHP网站自动化配置的实现方法(必看)
2017/05/27 PHP
PHP实现字符串的全排列详解
2019/04/24 PHP
php+mysql实现的无限分类方法类定义与使用示例
2020/05/27 PHP
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
浅析Node.js的Stream模块中的Readable对象
2015/07/29 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
小程序api实现promise封装过程解析
2019/11/21 Javascript
jQuery实现手风琴特效
2021/01/11 jQuery
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
Python中的异常处理简明介绍
2015/04/13 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
2018/02/22 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python中函数参数调用方式分析
2018/08/09 Python
树莓派3 搭建 django 服务器的实例
2019/08/29 Python
Python调用Windows API函数编写录音机和音乐播放器功能
2020/01/05 Python
详解python的变量缓存机制
2021/01/24 Python
Html5游戏开发之乒乓Ping Pong游戏示例(一)
2013/01/21 HTML / CSS
美国知名的家庭连锁百货商店:Boscov’s
2017/07/27 全球购物
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
英国高街电视:High Street TV
2018/05/22 全球购物
印度在线购买电子产品网站:Croma
2020/01/02 全球购物
应届生船舶驾驶求职信
2013/10/19 职场文书
奶茶店创业计划书范文
2014/01/17 职场文书
职业生涯规划书结束语
2014/04/15 职场文书
分公司负责人任命书
2014/06/04 职场文书
优秀高中学生评语
2014/12/30 职场文书
初中政治教学工作总结
2015/08/13 职场文书
解决sql server 数据库,sa用户被锁定的问题
2021/06/11 SQL Server
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript