文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>[SESSION]数据库存储session,大家提提意见

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

时间:2007-02-17  来源:PHP爱好者

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
支持: [email protected]
*/

$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以后,内存表 比以前好很多了
php爱好者站 http://www.phpfans.net PHP|MySQL|javascript|ajax|html.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载