歡迎您光臨本站 註冊首頁

Linux下Web服務基於資料庫的會話管理

←手機掃碼閱讀     火星人 @ 2014-03-29 , reply:0

  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網站。

  3 基於資料庫的會話管理的實現

  本文下面將給出用PHP語言實現的一個基於資料庫的會話管理機制[2],這個會話管理機制採用RedHat7.2 Linux操作系統平台,Apache1.3.20 Web伺服器程序,PostgreSQL7.0網路資料庫。本機制可根據用戶的需要進行修改和擴展,另外程序中使用了PHP語言的PEAR對象模塊庫,利用PEAR內的DB模塊可實現資料庫類型無關性操作[3],也就是說用戶的網路資料庫可選擇Linux操作系統支持的其它資料庫,如MySQL、Oracle、SyBase、Informix和MiniSQL等資料庫。實現代碼如下:

  1.創建資料庫和表
QUOTE:
CREATE DATABASE sessions
CREATE TABLE sessions ( sesskey char(32) PRIMARY KEY,
expiry int NOT NULL,
alue text NOT NULL)

  2.PHP語言實現的會話管理機制
QUOTE:
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伺服器應用程序的開發。在常見的三種會話管理機制中,基於資料庫的會話管理機制最容易擴展,對訪問量負載能力也較強。

[火星人 ] Linux下Web服務基於資料庫的會話管理已經有298次圍觀

http://coctec.com/docs/linux/show-post-203420.html