使用数据库保存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实现的功能是显示8条基色色带
Oct 09 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
php表单提交问题的解决方法
Apr 12 PHP
php正则表达匹配中文问题分析小结
Mar 25 PHP
php使用curl和正则表达式抓取网页数据示例
Apr 13 PHP
基于PHP的简单采集数据入库程序
Jul 30 PHP
PHP-FPM之Chroot执行环境详解
Aug 03 PHP
CI(Codeigniter)的Setting增强配置类实例
Jan 06 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
laravel 执行迁移回滚示例
Oct 23 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 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 autoload机制的详解
2013/06/09 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
一些mootools的学习资源
2010/02/07 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
2012/12/07 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
jQuery实现图片走马灯效果的原理分析
2016/01/16 Javascript
浅谈jQuery中的eq()与DOM中element.[]的区别
2016/10/28 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
微信小程序实现animation动画
2018/01/26 Javascript
解决layer 关闭当前弹窗 关闭遮罩层 input值获取不到的问题
2019/09/25 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
python语言使用技巧分享
2016/05/31 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
Django REST framework内置路由用法
2019/07/26 Python
Python3 无重复字符的最长子串的实现
2019/10/08 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
2020/04/22 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
Python使用pyenv实现多环境管理
2021/02/05 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
HTML5 Canvas画线技巧——实现绘制一个像素宽的细线
2013/08/02 HTML / CSS
护理专业自我鉴定
2014/01/30 职场文书
搞笑征婚广告词
2014/03/17 职场文书
十周年庆典策划方案
2014/06/03 职场文书
2014社区健康教育工作总结
2014/12/16 职场文书
水电工程师岗位职责
2015/02/13 职场文书
保送生自荐信范文
2015/03/26 职场文书
工程款申请报告
2015/05/15 职场文书
2015年基层党支部工作总结
2015/05/21 职场文书
2016五一劳动节慰问信
2015/11/30 职场文书
2021-4-3课程——SQL Server查询【2】
2021/04/05 SQL Server
SQL Server Agent 服务无法启动
2022/04/20 SQL Server
MySQL 字符集 character
2022/05/04 MySQL