使用数据库保存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中的正规表达式(一)
Oct 09 PHP
php 文件上传系统手记
Oct 26 PHP
解析PayPal支付接口的PHP开发方式
Nov 28 PHP
php关于array_multisort多维数组排序的使用说明
Jan 04 PHP
那些年一起学习的PHP(三)
Mar 22 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 PHP
ZF框架实现发送邮件的方法
Dec 03 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
Sep 22 PHP
yii2中关于加密解密的那些事儿
Jun 12 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
阿里对象存储OSS在laravel框架中的使用方法
Oct 13 PHP
thinkphp5框架路由原理与用法详解
Feb 11 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
yii框架通过控制台命令创建定时任务示例
2014/04/30 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
PHP检测用户语言的方法
2015/06/15 PHP
WordPress主题制作之模板文件的引入方法
2015/12/28 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
thinkPHP5.1框架中Request类四种调用方式示例
2019/08/03 PHP
页面中js执行顺序
2009/11/09 Javascript
js中reverse函数的用法详解
2013/12/26 Javascript
js中document.write使用过程中的一点疑问解答
2014/03/20 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
javascript精确统计网站访问量实例代码
2015/12/19 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
通过原生JS实现为元素添加事件的方法
2016/11/23 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
node.js中fs.stat与fs.fstat的区别详解
2017/06/01 Javascript
js canvas实现放大镜查看图片功能
2017/06/08 Javascript
零基础写python爬虫之爬虫编写全记录
2014/11/06 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
python常用知识梳理(必看篇)
2017/03/23 Python
使用python 爬虫抓站的一些技巧总结
2018/01/10 Python
pytorch进行上采样的种类实例
2020/02/18 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
Selenium 滚动页面至元素可见的方法
2020/03/18 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
法制宣传教育方案
2014/05/09 职场文书
科技之星事迹材料
2014/06/02 职场文书
人事主管岗位职责说明书
2014/07/30 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
万能检讨书开头与结尾怎么写
2015/02/17 职场文书
中学教师师德师风承诺书
2015/04/28 职场文书
湘江北去观后感
2015/06/15 职场文书
消夏晚会主持词
2015/06/30 职场文书