[SESSION]数据库存储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
|