使用数据库保存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函数的常用方法及注意之处小结
Jul 10 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
php调用google接口生成二维码示例
Apr 28 PHP
PHP实现单例模式最安全的做法
Jun 13 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
php页面缓存方法小结
Jan 10 PHP
php通过排列组合实现1到9数字相加都等于20的方法
Aug 03 PHP
在WordPress中使用wp-cron插件来设置定时任务
Dec 10 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
Dec 14 PHP
CodeIgniter常用知识点小结
May 26 PHP
PHP实现接收二进制流转换成图片的方法
Jan 10 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简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
php 从指定数字中获取随机组合的简单方法(推荐)
2017/04/05 PHP
jquery和css3实现的炫酷时尚的菜单导航
2014/09/01 Javascript
js判断当前页面在移动设备还是在PC端中打开
2016/01/06 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
vue .js绑定checkbox并获取、改变选中状态的实例
2018/08/24 Javascript
node实现分片下载的示例代码
2018/10/17 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
js+html5 canvas实现ps钢笔抠图
2019/04/28 Javascript
基于vue如何发布一个npm包的方法步骤
2019/05/15 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
2019/05/30 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
layui实现图片虚拟路径上传,预览和删除的例子
2019/09/25 Javascript
vue项目接口域名动态获取操作
2020/08/13 Javascript
vue v-model的用法解析
2020/10/19 Javascript
[02:40]DOTA2英雄基础教程 巨牙海民
2013/12/23 DOTA
调试Python程序代码的几种方法总结
2015/04/28 Python
Python使用django获取用户IP地址的方法
2015/05/11 Python
Python变量和字符串详解
2017/04/29 Python
python3 遍历删除特定后缀名文件的方法
2018/04/23 Python
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Django CSRF跨站请求伪造防护过程解析
2019/07/31 Python
python打开使用的方法
2019/09/30 Python
使用python对excel表格处理的一些小功能
2021/01/25 Python
全天然狗零食:Best Bully Sticks
2016/09/22 全球购物
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
美国按摩椅批发网站:Titan Chair
2018/12/27 全球购物
美国时尚假发购物网站:Wigsbuy
2019/04/06 全球购物
党员干部承诺书
2014/03/25 职场文书
诉讼授权委托书
2014/10/15 职场文书
导游词范文之颐和园/重庆/云台山
2019/09/10 职场文书