论坛登陆 注册 文章专区 笑话频道 影视频道 投稿文章 旧版浏览
首页 | 页界资讯 | 网络应用 | 软件应用 | 组网技术 | 网络原理 | 聊天通讯 | 网管知识 | 帮助
笑话 | 操作系统 | 注 册 表 | 编程开发 | 数 据 库 | 媒体动画 | 网页设计 | 图形图象 | 地图
论坛 | 网络安全 | 安全防范 | 服 务 器 | 硬件学堂 | 路由技术 | 搜索研究 | 站长经验 | 投稿
影院 | 教育频道 | 特色专题 | 精文荟萃 | 注 册 码 | 论坛社区 | 网站地图 | 广告服务 | 旧版
设为首页 加入收藏
当前位置:首页>>文章>>编程开发>>php专区>>正文

使用 MySQL 开始 PHP 会话

www.xker.com 作者:andot 来源:coolcode 加入日期:2006-1-10 10:40:41

【问题提问、论坛交流】

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

  1. 会话文件一般都很小,但文件数却很多,在文件系统中保存许多这样的小文件非常浪费空间,且效率不高
  2. 分布式的站点难以利用会话文件来共享会话
  3. 会话文件方式不利于统计在线用户的会话信息

为解决以上问题,我们可以考虑用数据库来保存会话信息

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

下面是 sessions 表的结构:

  1. DROP TABLE IF EXISTS `sessions`;
  2. CREATE TABLE `sessions` (
  3.   `session_id` varchar(32) NOT NULL default '',
  4.   `user_id` int(10) unsigned NOT NULL default '0',
  5.   `data_value` text NOT NULL,
  6.   `last_visit` timestamp(14) NOT NULL,
  7.   PRIMARY KEY (`session_id`),
  8.   KEY `user_id` (`user_id`)
  9. ) 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 类》

  1. <?php
  2. /**
  3. * @author
  4. * @copyright */
  5. require_once("class_mysql.php");
  6. class session {
  7.     var $db;
  8.     function session(&$db) {
  9.         $this->db = &$db;
  10.         session_module_name('user');
  11.         session_set_save_handler(
  12.             array(&$this, 'open'),
  13.             array(&$this, 'close'),
  14.             array(&$this, 'read'),
  15.             array(&$this, 'write'),
  16.             array(&$this, 'destroy'),
  17.             array(&$this, 'gc')
  18.         );
  19.         session_start();
  20.     }
  21.     function unserialize($data_value) {
  22.         $vars = preg_split(
  23.             '/([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)\|/',
  24.             $data_value, -1, PREG_SPLIT_NO_EMPTY |               
  25.             PREG_SPLIT_DELIM_CAPTURE
  26.         );
  27.         for ($i = 0; $vars[$i]; $i++) {
  28.             $result[$vars[$i++]] = unserialize($vars[$i]);   
  29.         }
  30.         return $result;
  31.     }
  32.     function open($path, $name) {
  33.         return true;
  34.     }
  35.     function close() {
  36.         return true;
  37.     }
  38.     function read($session_id) {
  39.         $session_id = $this->db->escape_string($session_id);
  40.         if ($row = $this->db->query("select * from `sessions` where `session_id` = '$session_id' limit 1")) {
  41.             return $row['data_value'];
  42.         }
  43.         else {
  44.             $this->db->query("insert into `sessions` set `session_id` = '$session_id'");
  45.             return "";
  46.         }
  47.     }
  48.     function write($session_id, $data_value) {
  49.         $data = $this->unserialize($data_value);
  50.         $session_id = $this->db->escape_string($session_id);
  51.         $data_value = $this->db->escape_string($data_value);
  52.         $this->db->query("update `sessions` set " 
  53.                                 . "`user_id` = '{$data['user_id']}', "
  54.                                 . "`data_value` = '$data_value', "
  55.                                 . "`last_visit` = null "
  56.                                 . "where `session_id` = '$session_id'");
  57.         return true;
  58.     }
  59.     function destroy($session_id) {
  60.         $session_id = $this->db->escape_string($session_id);
  61.         $this->db->query("delete from `sessions` where `session_id` = '$session_id'");
  62.         return true;
  63.     }
  64.     function gc($lifetime) {
  65.         $this->db->query("delete from `sessions` where unix_timestamp(now()) - unix_timestamp(`last_visit`) > $lifetime");
  66.         return true;
  67.     }
  68.     // get sessions by user_id
  69.     function get($user_id) {
  70.         $user_id = $this->db->escape_string($user_id);
  71.         return $this->db->query("select * from `sessions` where `user_id` = '$user_id'");
  72.     }
  73.     // get sessions list
  74.     function lists($page, $rows) {
  75.         if ($page == 0) {
  76.             return $this->db->query("select * from `sessions` order by `user_id`");
  77.         }
  78.         else {
  79.             $start = ($page - 1) * $rows;
  80.             return $this->db->query("select * from `sessions` order by `user_id` limit $start, $rows");
  81.         }
  82.     }
  83. }
  84. ?>

本新闻共2页,当前在第1页  1  2  

编辑:xker.com

上一篇:使用 MySQL 开始 PHP 会话
下一篇:没有了
关闭窗口】【浏览次数:】【发送给好友】【收藏此页
相关文章
·使用 MySQL 开始 PHP 会话·使用 MySQL 开始 PHP 会话·ASP、JSP、PHP 三种技术比较
·PHP应用程序加速探索之简介 ·PHP应用程序加速探索之简介 ·在Win2003 IIS中安装PHP
·有效防御PHP木马攻击的技巧 ·设置MySql数据同步·最令PHP初学者头痛的十四个问题 
·初学者必读 PHP常用开发工具分析
推荐文章 最新文章 热门文章
·使用 MySQL 开始 PHP 会话
·使用 MySQL 开始 PHP 会话
·AJAX及使用E4X编写Web服务脚本
·关于ASP,ASP.NET,VB.NET里的MD5加密函
·Visual C#常用函数和方法集汇总
·硬盘故障软修理技巧解决方法 
·网吧使用电脑必看5点安全技巧
·在VC++应用程序中实现颜色选择组合框
·确保信息:系统备份和恢复完全解决方
·Win XP最关心的几个问题及解决
·图文:Windows平台上jsp虚拟主机环境的
·你再有钱也得算计!装机最贵与免费的
·打造完美Linux系统:多种疑难杂症的解
·Oracle SQL 内置函数大全
·“一键GHOST”傻瓜式系统备份与恢复
·使用 MySQL 开始 PHP 会话
·使用 MySQL 开始 PHP 会话
·使用 MySQL 开始 PHP 会话
·如何解决上网后系统越来越变慢的问题
·没电脑也看FLASH 将FLASH文件转化为V
·Photoshop 绘制经典逼真火焰字特效
·AJAX案例研究之Gmail
·AJAX的七宗罪
·Ajax/Amowa框架中国造 Buffalo 1.2近
·XMLHttpRequest和AJAX入主Web开发
·AJAX框架JSON-RPC-Java 1.0rc2 发布
·基于Ajax的Web框架Echo2 2.0 正式发布
·AJAX 弄潮Web 2.0 在线Office项目复活
·MyEclipse 4.1 将支持AJAX
·AJAX/XUL Web框架新工具-ZK发布
·个人简历表格
·免费代理IP(每日更新)
·QQ密码丢失后能做的事情:快速找回密码
·WinRAR 3.51 注册码
·Norton AntiVirus 2006 注册码(激活
·系统优化 专题
·史上最强QQ个人档案资料欣赏
·找回QQ密码的注意事项 
·最经典的黑客入门教材
·求职简历封皮
·怎样查找对方的IP地址
·应届毕业生求职信
·2005最新最全注册码集中营(11月更新)
·FlashFXP 3.3.1 build 1089注册码
·ACDSee v8.0注册码
评论 本站声明
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
【注】 发表评论必需遵守以下条例:
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款
  • 本站大部分为网络转载,如有版权问题,请通知我们,我们立即更正!

设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003-2006 xker.com All rights reserved. 网站合作、广告联系QQ:12231446
小新技术网 冀ICP备05002857号