使用 MySQL 开始 PHP 会话


Posted in PHP onDecember 21, 2006

默认情况下,PHP会话(session)是通过文件来保存的。这样做有以下几个缺点:

    会话文件一般都很小,但文件数却很多,在文件系统中保存许多这样的小文件非常浪费空间,且效率不高。
    分布式的站点难以利用会话文件来共享会话。
    会话文件方式不利于统计在线用户的会话信息。
    为解决以上问题,我们可以考虑用数据库来保存会话信息。

    对于 PHP 开发来说,保存会话用 MySQL 是一个非常不错的选择。MySQL 提供一种建立在内存中的表类型 Heap,如果每条会话数据量很小的话,可以考虑用这种类型的表来进一步优化性能。但是 Heap 类型的表有许多限制,例如它不支持 text 类型的字段,因此如果在无法预测会话数据记录长度的情况下,选择 MyISAM 是比较合适的,这种类型的表没有事物处理开销,对于基于磁盘的表可以得到最优性能。

    下面是 sessions 表的结构:

    DROP TABLE IF EXISTS `sessions`;
    CREATE TABLE `sessions` (
      `session_id` varchar(32) NOT NULL default '',
      `user_id` int(10) unsigned NOT NULL default '0',
      `data_value` text NOT NULL,
      `last_visit` timestamp(14) NOT NULL,
      PRIMARY KEY (`session_id`),
      KEY `user_id` (`user_id`)
    ) TYPE=MyISAM;
    PHP 支持用户会话模块,可以通过 session_set_save_handler 来设置自定义的会话处理函数。因为默认的处理模块是 files,因此要在用 session_set_save_handler 设置会话处理函数之前,先用 session_module_name('user') 来告诉 PHP 使用用户会话模块, 而session_set_save_handler 必须要在 session_start 之前执行。

    用户会话数据在会话处理函数中都是序列化之后的,要取出其中的某个会话变量,可以对其进行反序列化,默认是 php 序列化方式,可以用 session::unserialize 函数来反序列化。

    下面的代码定义了一个用 MySQL 来处理 PHP 会话的类,其中所使用的 class_mysql.php 请参见 《超级简单但超级实用的 PHP 的 mysql 类》 。

    〈?php
    /**
    * @author 马秉尧
    * @copyright (C) 2005 CoolCode.CN
    */

    require_once(“class_mysql.php“);

    class session {
        var $db;
        function session(&$db) {
            $this-〉db = &$db;
            session_module_name('user');
            session_set_save_handler(
                array(&$this, 'open'),
                array(&$this, 'close'),
                array(&$this, 'read'),
                array(&$this, 'write'),
                array(&$this, 'destroy'),
                array(&$this, 'gc')
            );
            session_start();
        }
        function unserialize($data_value) {
            $vars = preg_split(
                '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
                $data_value, -1, PREG_SPLIT_NO_EMPTY |
                PREG_SPLIT_DELIM_CAPTURE
            );
            for ($i = 0; $vars[$i]; $i++) {
                $result[$vars[$i++]] = unserialize($vars[$i]);
            }
            return $result;
        }
        function open($path, $name) {
            return true;
        }
        function close() {
            return true;
        }
        function read($session_id) {
            $session_id = $this-〉db-〉escape_string($session_id);
            if ($row = $this-〉db-〉query(“select * from `sessions` where `session_id` = '$session_id' limit 1“)) {
                return $row['data_value'];
            }
            else {
                $this-〉db-〉query(“insert into `sessions` set `session_id` = '$session_id'“);
                return ““;
            }
        }
        function write($session_id, $data_value) {
            $data = $this-〉unserialize($data_value);
            $session_id = $this-〉db-〉escape_string($session_id);
            $data_value = $this-〉db-〉escape_string($data_value);
            $this-〉db-〉query(“update `sessions` set “
                                    . “`user_id` = '{$data['user_id']}', “
                                    . “`data_value` = '$data_value', “
                                    . “`last_visit` = null “
                                    . “where `session_id` = '$session_id'“);
            return true;
        }
        function destroy($session_id) {
            $session_id = $this-〉db-〉escape_string($session_id);
            $this-〉db-〉query(“delete from `sessions` where `session_id` = '$session_id'“);
            return true;
        }
        function gc($lifetime) {
            $this-〉db-〉query(“delete from `sessions` where unix_timestamp(now()) - unix_timestamp(`last_visit`) 〉 $lifetime“);
            return true;
        }
        // get sessions by user_id
        function get($user_id) {
            $user_id = $this-〉db-〉escape_string($user_id);
            return $this-〉db-〉query(“select * from `sessions` where `user_id` = '$user_id'“);
        }
        // get sessions list
        function lists($page, $rows) {
            if ($page == 0) {
                return $this-〉db-〉query(“select * from `sessions` order by `user_id`“);
            }
            else {
                $start = ($page - 1) * $rows;
                return $this-〉db-〉query(“select * from `sessions` order by `user_id` limit $start, $rows“);
            }
        }
    }
    ?〉

    这个类的使用很简单,在原来使用 session_start 的地方,替换成 $session = new session($db) 就可以了。$db 表示 sessions 表所在的数据库。

    另外可以用 get 方法来获取某个用户的所有会话信息,通过 lists 方法来得到所有用户会话列表。这样就可以方便的管理用户会话了。 

PHP 相关文章推荐
PHP也可以?成Shell Script
Oct 09 PHP
Zend studio文件注释模板设置方法
Sep 29 PHP
php中strtotime函数用法详解
Nov 15 PHP
用php守护另一个php进程的例子
Feb 13 PHP
php利用事务处理转账问题
Apr 22 PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 PHP
PHP中header用法小结
May 23 PHP
谈谈PHP连接Access数据库的注意事项
Aug 12 PHP
Yii实现文章列表置顶功能示例
Oct 18 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
php实现微信公众号企业转账功能
Oct 01 PHP
laravel框架分组控制器和分组路由实现方法示例
Jan 25 PHP
PHP 编程请选择正确的文本编辑软件
Dec 21 #PHP
PHP 模板高级篇总结
Dec 21 #PHP
PHP函数utf8转gb2312编码
Dec 21 #PHP
小偷PHP+Html+缓存
Dec 20 #PHP
PR值查询 | PageRank 查询
Dec 20 #PHP
转PHP手册及PHP编程标准
Dec 17 #PHP
IIS环境下快速安装、配置和调试PHP5.2.0
Dec 17 #PHP
You might like
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
Javascript !!的作用
2008/12/04 Javascript
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
加载jQuery后$冲突的解决办法
2010/07/09 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
html向js方法传递参数具体实现
2013/08/08 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
javascript中 try catch用法
2015/08/16 Javascript
CSS中position属性之fixed实现div居中
2015/12/14 Javascript
AngularJS使用ngMessages进行表单验证
2015/12/27 Javascript
Boostrap模态窗口的学习小结
2016/03/28 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
python使用Flask操作mysql实现登录功能
2018/05/14 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
django query模块
2019/04/20 Python
PyCharm刷新项目(文件)目录的实现
2020/02/14 Python
详解Python中的Lock和Rlock
2021/01/26 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?
2016/01/12 面试题
本科生个人求职自荐信
2013/09/26 职场文书
物流管理专业大学生自荐信
2013/10/04 职场文书
外语专业毕业生自我评价分享
2013/10/05 职场文书
幼儿园教师节活动方案
2014/02/02 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
大雁塔英文导游词
2015/02/10 职场文书
2015年世界艾滋病日活动总结
2015/03/24 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
html,css,javascript是怎样变成页面的
2023/05/07 HTML / CSS