使用数据库保存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 flv视频时间获取函数
Jun 29 PHP
PHP include_path设置技巧分享
Jul 03 PHP
解析php file_exists无效的解决办法
Jun 26 PHP
使用PHP实现Mysql读写分离
Jun 28 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
Jan 17 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
PHP多线程编程之管道通信实例分析
Mar 07 PHP
php 从一个数组中随机的取出若干个不同的数实例
Dec 31 PHP
php利用fsockopen GET/POST提交表单及上传文件
May 22 PHP
PHP __call()方法实现委托示例
May 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中用header图片地址 简单隐藏图片源地址
2008/04/09 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
CI(CodeIgniter)模型用法实例分析
2016/01/20 PHP
Yii2主题(Theme)用法详解
2016/07/23 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
关于递归运算的顺序测试代码
2011/11/30 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
IE中document.createElement的iframe无法设置属性name的解决方法
2015/09/14 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
Jquery实现跨域异步上传文件总结
2017/02/03 Javascript
vue音乐播放器插件vue-aplayer的配置及其使用实例详解
2017/07/10 Javascript
基于iScroll实现下拉刷新和上滑加载效果
2017/07/18 Javascript
AngularJS路由删除#符号解决的办法
2017/09/28 Javascript
SeaJS中use函数用法实例分析
2017/10/10 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
在HTML文档中嵌入JavaScript的四种方法
2018/05/07 Javascript
vue组件传值的实现方式小结【三种方式】
2020/02/05 Javascript
python strip()函数 介绍
2013/05/24 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
Django中的session用法详解
2020/03/09 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
Python 创建守护进程的示例
2020/09/29 Python
HTML5操作WebSQL数据库的实例代码
2017/08/26 HTML / CSS
SVG实现多彩圆环倒计时效果的示例代码
2017/11/21 HTML / CSS
美国真皮手袋品牌:GiGi New York
2017/03/10 全球购物
灵泰克Java笔试题
2016/01/09 面试题
初三学生个人自我评定
2014/04/06 职场文书
施工安全承诺书
2014/05/22 职场文书
演讲稿开场白台词
2014/08/25 职场文书
应届毕业生求职简历自我评价
2015/03/02 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
pytorch 权重weight 与 梯度grad 可视化操作
2021/06/05 Python
SQL Server表分区删除详情
2021/10/16 SQL Server