使用数据库保存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手册及PHP编程标准
Dec 17 PHP
php中对xml读取的相关函数的介绍一
Jun 05 PHP
php反弹shell实现代码
Apr 22 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
Jun 21 PHP
PHP实现批量修改文件后缀名的方法
Jul 30 PHP
yii实现model添加默认值的方法(2种方法)
Jan 06 PHP
PHP简单获取多个checkbox值的方法
Jun 13 PHP
Laravel最佳分割路由文件(routes.php)的方式
Aug 04 PHP
php_pdo 预处理语句详解
Nov 21 PHP
Laravel框架中自定义模板指令总结
Dec 17 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 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字符串 ==比较运算符的副作用
2009/10/21 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
Zend Framework上传文件重命名的实现方法
2016/11/25 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
Js参数值中含有单引号或双引号问题的解决方法
2013/11/06 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
2016/08/15 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
vue.js中mint-ui框架的使用方法
2017/05/12 Javascript
详解JS构造函数中this和return
2017/09/16 Javascript
js实现秒表计时器
2019/12/16 Javascript
JavaScript实现缓动动画
2020/11/25 Javascript
通过Python爬虫代理IP快速增加博客阅读量
2016/12/14 Python
Python代码实现KNN算法
2017/12/20 Python
详解python3中zipfile模块用法
2018/06/18 Python
详解Python3的TFTP文件传输
2018/06/26 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
python搜索包的路径的实现方法
2019/07/19 Python
基于python修改srt字幕的时间轴
2020/02/03 Python
解决Tensorflow 内存泄露问题
2020/02/05 Python
Python如何在循环内使用list.remove()
2020/06/01 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
Linux如何命名文件--使用文件名时应注意
2012/01/22 面试题
安全资金保障制度
2014/01/23 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
个人委托书范本
2014/09/13 职场文书
先进个人总结范文
2015/02/15 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书
入党后的感想
2015/08/10 职场文书
Idea连接MySQL数据库出现中文乱码的问题
2021/04/14 MySQL
jackson json序列化实现首字母大写,第二个字母需小写
2021/06/29 Java/Android
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
redis lua限流算法实现示例
2022/07/15 Redis