[SESSION]数据库存储session,大家提提意见

发表于:2007-05-25来源:作者:点击数: 标签:数据库session大家存储
CREATETABLE`seauser_sessions`( `session_id`char(32)NOTNULLdefault'', `session_user_id`mediumint(8)NOTNULLdefault'0', `session_start`int(11)NOTNULLdefault'0', `session_time`int(11)NOTNULLdefault'0', PRIMARYKEY(`session_id`), KEY`session_use

CREATE TABLE `seauser_sessions` (
  `session_id` char(32) NOT NULL default '',
  `session_user_id` mediumint(8) NOT NULL default '0',
  `session_start` int(11) NOT NULL default '0',
  `session_time` int(11) NOT NULL default '0',
  PRIMARY KEY  (`session_id`),
  KEY `session_user_id` (`session_user_id`),
) ENGINE=MyISAM DEFAULT CHARSET=latin1

<?php
/**
文件名: sessions.php
功能: 会话功能
作者: 韩三普
日期: 2005-8-1 to 2005-8-1
版权: (C) 2005 HanSanpu
支持: sanpu@eyou.com
*/

$session_life = get_cfg_var("session.gc_maxlifetime");
$sess_read = '';

function sess_open()
{
sess_gc(0);
return true;
}

function sess_close()
{
global $db;
$db->sql_close;
return true;
}

function sess_read($session_id)
{
global $db, $sess_read;
$sql = 'SELECT * FROM ' . SESSIONS_TABLE . "WHERE `session_id` = . '$session_id'";
$result = $db->sql_query($sql);
if ($result && $db->sql_numrows($result))
{
$sess_read = $db->sql_fetchrow($result);
return $sess_read;
}
else
{
return '';
}
}

function sess_write($session_id)
{
global $db, $session_life, $sess_read;
$expiry = time() + $session_life;

if ( !$sess_read )
{
$sql_insert = "INSERT INTO " . SESSIONS_TABLE . " (`session_id`, `session_user_id`, `session_start`, `session_time`) VALUES('$session_id','$user_id','".time()."','$expiry')";
$result = $db->sql_query($sql_insert);
return true;
}
else
{
$sql_update = "UPDATE " . SESSIONS_TABLE . " SET `session_time` = '$expiry' WHERE `session_id` = '$session_id'";
$result = $db->sql_query($sql_update);
}
}

function sess_destroy($session_id)
{
global $db;
$sql = "DELETE FROM " . SESSIONS_TABLE . " WHERE `seesion_id` = '$session_id'";
$result = $db->sql_query($sql);
}

function sess_gc($session_life)
{
global $db;
$sql = "DELETE FROM " . SESSIONS_TABLE . " WHERE `session_time` < " . time() . "";
$result = $db->sql_query($sql);
return $db->sql_affectedrows();
}

session_set_save_handler('sess_open','sess_close','sess_read','sess_write','sess_destroy','sess_gc');
@session_start();
?>

 北京野狼 回复于:2005-08-02 11:01:56
效率低,维护麻烦。

 韩三普 回复于:2005-08-02 11:09:46
刚刚学PHP,呵呵,弄出来这个不成熟的东西,怎么能做的效率高一点呢^^

能否针对代码稍加评述?

 北京野狼 回复于:2005-08-02 11:12:02
我的意思是完全没有必要使用数据库代替文件

 北京野狼 回复于:2005-08-02 11:13:39
http://bbs.chinaunix.net/forum/viewtopic.php?t=581113

 韩三普 回复于:2005-08-02 11:14:31
如果用文件系统,当用户多到一定程度,读取会比数据库慢好多呀。数据库本身就是为了优化查询设计的吧。

 北京野狼 回复于:2005-08-02 11:19:23
数据库永远比文件慢

 hitty 回复于:2005-08-02 11:46:07
可以参考phpbb的SESSION做法....

 韩三普 回复于:2005-08-02 12:04:01
很厉害,一时不能完全吸收,所以做出来这个纯SESSION的来玩,BB好像是优先COOKIE的,并且很智能,复杂了,写法也不传统,不适合初学者吧,改日再研究,我先这个只是想先多多理解SESSION,下一步也会向BB靠拢。
有人能说说上面这段代码哪些比较垃圾吗?

 clampox 回复于:2005-08-04 11:49:15
写得可以,比我初学PHP时强多了

可以优化一下,因为大多数时候是在UPDATE,新建SESSION时才INSERT,所以可以变下顺序,
session_write的时候,可以先UPDATE,用mysql_info函数取信息,根据信息来判断是否INSERT,往往可以少跑一次数据库来回。

 韩三普 回复于:2005-08-04 16:23:13
谢谢clampox的指点^^

 hitty 回复于:2005-08-05 09:43:33
可以只用insert和delete就可以了...这样可能最快

 wangyih 回复于:2005-08-05 19:42:42
楼主可别听上面两位乱说。

 Max.H 回复于:2005-08-06 18:15:30
不明白这样存有什么用?
一般存到数据库是为了多台服务器共享SESSION吧?

 jiangsu3000 回复于:2005-08-15 16:21:35
其实用文件做,你就可以针对你的数据结构设计好的查询算法,所以会相对你的应用会比只要查询就用"selecet"修改就用"update"会高效点...

 恋太后天 回复于:2005-08-16 10:47:14
与文本相比的效率如何可以实际测试一次
用数据库存的最大意义在于多服务器共享
虽然故意弄成那样也并非最好的做法来的
但毕竟它实现了

 redor 回复于:2005-08-16 20:43:51
你有100w用户的时候。。。。。你的mysql数据库能撑多长时间?技术是可以实现,但是用起来。。。。

 韩三普 回复于:2005-08-16 21:27:52
可以采用数据库分布的方式,自动平衡就行了。现在我和你们讨论这个还有点早,呵呵 。

不过说到这里,把大致思路给大家介绍一下。

一台主mysql服务器,做主要存储用,所以存储的数据都先存这上面,由它分发给其它用来平衡的N台服务器上,session的应用应该是读远远大于写吧,所以,每当网站服务器Apache等请求查询的话,可以把查询请求动态的分到用来平衡的N台服务器上。这样,就是1000w人,可能压力也不是特别的大吧。当然,如果有更高的要求,还会有其它配置的方法,“数据库”只所以叫“数据库”,做为存储就有文件系统比不了的优势。

个人一点小看法,大家接着讨论。初识PHP,已经迷上了。接着学基本功去了^^BYE!

BY 韩三普

 jzz_zh 回复于:2005-08-17 00:58:38
[quote:6ce4d882f3="韩三普"]如果用文件系统,当用户多到一定程度,读取会比数据库慢好多呀。数据库本身就是为了优化查询设计的吧。[/quote:6ce4d882f3]

使用mysql的内存表吧

mysql4.1以后,内存表 比以前好很多了

原文转自:http://www.ltesting.net