Linux下Web服务基于数据库的会话管理
发表于:2007-07-04来源:作者:点击数:
标签:
摘 要:本文讨论了Cookie技术和会话管理机制。采用RedHat7.2 Linux 、Apache1.3.20和PostgreSQL7.1 网络 数据库实现了一个基于数据库会话管理的Web服务。 关键词:Web 服务器 数据库 会话管理 1 Web服务中会话概念的产生 Cookie是Web服务器发送给Web浏览器的
摘 要:本文讨论了Cookie技术和会话管理机制。采用RedHat7.2 Linux、Apache1.3.20和PostgreSQL7.1网络数据库实现了一个基于数据库会话管理的Web服务。
关键词:Web服务器 数据库 会话管理
1 Web服务中会话概念的产生
Cookie是Web服务器发送给Web浏览器的体积很小的纯文本信息,以文本文件的形式存放在用户的计算机中,这些Cookie一般用于保存用户的访问状态,当用户再次访问同一个网站时会将这些Cookie信息发送回服务器,使得服务器能够恢复用户上一次的访问状态。使用Cookie的根本目的是为了在用户访问期间实现不同页面之间的数据传输,以解决HTTP无状态的问题。Cookie技术能够增强网站的服务功能,为用户带来方便。但是Cookie还有许多限制和不足,如每台用户计算机一般只允许存放300个Cookie,同一个Web服务器只能发送20个Cookie等。
针对Cookie技术的局限性,美国微软公司首先提出了会话(Session)的概念[1],并将会话技术集成在ASP(动态服务器网页)语言中。会话是指用户访问Web服务器期间存放在Web服务器上的所有与用户访问状态有关的信息。每次新创建的会话都有一个唯一的标识串,称为会话ID,会话ID被保存在Web服务器中,其它会话信息都在会话ID的索引下进行保存和读取。一次会话从创建到被删除的时间称为会话生存期,会话生存期的长短由会话管理机制决定。Cookie与会话的不同之处在于:Cookie将用户访问的状态信息通过Web浏览器存放在用户计算机中,而会话通过会话管理机制存放在Web服务器中。
2 会话管理机制
会话的优势是它可以保存在Web服务器的内存、文件或数据库中,这样就有三种会话管理机制:基于内存的会话管理、基于文件的会话管理和基于数据库的会话管理。
基于内存的会话管理是运行速度最快的一种机制,它一般在Web服务器的内存中专门开辟一块共享内存区域,在这片内存区域中可直接快速地存取会话信息。这种机制对Web服务器的系统配置要求较高,需要系统资源能够负载较高的访问量,否则不仅不能提高访问速度,相反地还会因系统资源不足造成服务器负载过重。
基于文件的会话管理是使用最广泛的一种机制,会话信息一般以文本文件的形式存放在Web服务器的硬盘中。这种机制易于实现,对服务器的系统配置要求不高,但是存放会话信息的文件之间缺乏逻辑联系,当并发的访问量很大时会话管理的文件数目将增长很快,这不仅大大增加设计会话管理机制的难度,也会相应地影响存取会话信息的速度。
基于数据库的会话管理是最容易扩展的一种机制,它需要Web服务器有一个网络数据库系统支撑,会话信息全部存放在网络数据库中,在数据库系统的支持下会话管理可以充分利用数据库具有的事务处理、安全存取和数据完整性检验等机制,有效地管理所有的会话信息。会话信息在数据库中相互之间很容易建立起逻辑联系,设计出统一快速的存取方法。这种机制特别适用于访问量很大的大中型Web网站。
以上三种会话管理机制具有各自的特点和优势,其比较见表1:
表1 基于内存、文件和数据库的三种会话管理机制的比较3 基于数据库的会话管理的实现
本文下面将给出用PHP语言实现的一个基于数据库的会话管理机制[2],这个会话管理机制采用RedHat7.2 Linux操作系统平台,Apache1.3.20 Web服务器程序,PostgreSQL7.0网络数据库。本机制可根据用户的需要进行修改和扩展,另外程序中使用了PHP语言的PEAR对象模块库,利用PEAR内的DB模块可实现数据库类型无关性操作[3],也就是说用户的网络数据库可选择Linux操作系统支持的其它数据库,如MySQL、Oracle、SyBase、Informix和MiniSQL等数据库。实现代码如下:
1.创建数据库和表
CREATE DATABASE sessions
CREATE TABLE sessions ( sesskey char(32) PRIMARY KEY,
expiry int NOT NULL,
alue text NOT NULL)2.PHP语言实现的会话管理机制
<?php
require_once("DB.php");
$SESS_DBHOST = "localhost"; /*数据库服务器主机名*/
$SESS_DBNAME = "sessions"; /* 数据库名 */
$SESS_DBUSER = "kycman"; /* 数据库用户 */
$SESS_DBPASS = "kycman"; /* 数据库口令 */
$SESS_DBH = "";
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime");
function sess_open($save_path, $session_name) {
global $SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
$dns="pgsql://$SESS_DBUSER:$SESS_DBPASS@$SESS_DBHOST/$SESS_DBNAME";
$SESS_DBH=DB::connect($dns);
if (DB::isError($SESS_DBH)) {
die($SESS_DBH->getMessage());
}
return true;
}
function sess_close() {
$SESS_DBH->disconnect();
return true;
}
function sess_read($key) {
global $SESS_DBH, $SESS_LIFE;
$qry = "SELECT value FROM sessions
WHERE sesskey = '$key' AND expiry > " . time();
$qid = $SESS_DBH->query($qry);
if (list($value) = $qid->fetchRow()) {
return $value;
}
return false;
}
function sess_write($key, $val) {
global $SESS_DBH, $SESS_LIFE;
$expiry = time() + $SESS_LIFE;
$value = addslashes($val);
$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";
$qid = $SESS_DBH->query($qry);
if (!DB::isError($qid)) {
$qry = "UPDATE sessions SET expiry = $expiry,
value = '$value' WHERE sesskey = '$key' AND expiry > " . time();
$qid = $SESS_DBH->query($qry);
}
return $qid;
}
function sess_destroy($key) {
global $SESS_DBH;
$qry = "DELETE FROM sessions WHERE sesskey = '$key'";
$qid = $SESS_DBH->query($qry);
return $qid;
}
function sess_gc($maxlifetime) {
global $SESS_DBH;
$qry = "DELETE FROM sessions WHERE expiry < " . time();
$qid = $SESS_DBH->query($qry);
return $SESS_DBH->affectedRows();
}
session_set_save_handler("sess_open","sess_close",
"sess_read","sess_write",
"sess_destroy","sess_gc");
?>四、结语
Web服务器使用的HTTP是一种无状态协议,可用Cookie和会话管理技术弥补这一不足。由于Cookie技术有很大的局限性,目前常用会话管理机制保存用户的访问状态。会话技术的采用,不仅解决了大容量会话信息的存取问题,而且大大方便了Web服务器应用程序的开发。在常见的三种会话管理机制中,基于数据库的会话管理机制最容易扩展,对访问量负载能力也较强。
原文转自:http://www.ltesting.net