隨著 Web Scripts 愈來愈多,遇到要整合其它語言的機會也愈來愈多。
其中最不好處理的就是 Session,連 ASP 跟 ASP.Net 自己的 Session 都不相容了,
更諻論是不同語言之間的處理了。
一般常見的處理方式有二種,一種就是把 Session 存在資料庫裡面,另一種就是把變數直接寫到 Cookie 裡面共用。
Session 放在資料庫的優點是管理方便。但是在登入人數多的時候,很容易資料庫 Disk I/O 效能被大量佔用,相對整個網站的速度也會被拖下來。
另外一種方式是放在 Cookie 也非常方便,但是遇到關閉 Cookie 的瀏覽器或跨網域可能就沒軏了。
這時就不得不介紹 MySQL 一個好用的資料庫格式了。MySQL 大家比較常用的就是 MyISAM 跟 InnoDB ,但是別忘了 MySQL 也有一個相當好用的 Memory (Heap) 格式。
Memory 顧名思義就是把資料庫存在記憶體裡面,所以存取的速度相當的快。既然是存在記憶體裡面,當然在系統重新開機後,資料也會全部消失了。
這樣的特性拿來做 Session 是再好不過了,既能兼顧程式執行速度,也不會佔用資料庫的 Disk I/O。現在我們就先從 Session 的規畫開始慢慢講起:
Session 是要保持每個使用者自有的變數,所以使用者必需有一個唯一的 Session ID。
所以我們先在資料庫建一個 Session 的表單。
CREATE TABLE `session` ( `session_id` VARCHAR( 20 ) NOT NULL , `login_on` DATETIME NOT NULL , `login_ip` VARCHAR( 15 ) NOT NULL , `active_on` DATETIME , PRIMARY KEY ( `session_id` ) ) TYPE = HEAP ;
產生後寫入 session 表單,並用程式接取 session_id 的值,並且讓使用者在每一頁都能抓的到 Session ID。一般常見的做法是放在 QueryString 裡面,如:
active.php?sessoin_id=12345
之後每一頁皆必需傳遞 Session ID 的值。
有了 Session ID,之後,要設定使用者的 Session 變數就可以再設計一個 Key/Value 的Memory 資料庫表單,並以 session_id 做為明細的關連。
CREATE TABLE `session_var` ( `session_id` VARCHAR( 30 ) NOT NULL , `session_key` VARCHAR( 100 ) NOT NULL , `session_value` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `session_id` ) ) TYPE = HEAP ;
之後要設定使用者的 Session 變數,只要寫入 session_var 這個表單,並用 SQL 指令
存取就可以了。
再來就是要定時去清除 Session 裡的資料,在使用者每動作一次,可以把時間 Update
到 session 表單內的 active_on 欄位,等超過一定的時間沒有動作,就代表這個 Session 已經失效了,便可以從表單裡面移除。
這樣就是很基本的 Session 控制流程,按照上面的規畫,就算是跨伺服器、跨語言跟跨 Domain 都可以適用,是不是很容易呢? ^^
當然看過了 Session 之後,用 Memory 來建立 ASP 的 Application 功能就簡單許多了。
CREATE TABLE `application` ( `application_key` VARCHAR( 100 ) NOT NULL , `application_value` VARCHAR( 255 ) NOT NULL , PRIMARY KEY ( `application_key` ) ) TYPE = HEAP
之後讓所有使用者共用這個 applicatoin 表單來存取變數就可以了。
要注意的是 Memory 表單並不支援 BLOB 跟 Text 欄位,所以如果習慣用 ASP 的 Application 做聊天室的人就必須重新規畫表單了。
MySQL 的 Memory 表單大多用來當成像 M$ SQL Server 的 View 功能居多,
如果好好善用這個格式,相信還有很多應用可以發揮呢! ^_^
13 comments On 用 MySQL 建立跨平台語言的 Session 及 ASP 的 Application 功能
你好
我是一個遊戲網站的美編
不過個人有興趣網php程式撰寫方面學習
目前是個初學者
一直在找Session的資料
因為目前碰到一個Session無法跨網域的問題
想向您討教
不知先進是否能給于指點
Session 要跨網域的處理用我這一篇裡面寫的把 Session 放在資料庫已經算是蠻簡單的方法了。
因為 PHP Session 的運作方式必須參考 PHP 的官方資料,或是你也可以自己設計一套 Session 機制,建議你可以找專業的 PHP 程式設計師協助處理。
請問
hhtp://www.crazy.com.tw
跟
hhtp://my.crazy.com.tw
算是同一網域嗎
richard999:
試試 Session 讀不讀的到不就知道了嗎? ^^
讀不到~”~
站長您好:
覺得你這篇文章真是非常實用,可否請你提供完整的範例程式下載呢?
aday:
抱歉,我這篇只是提供一個概念,並無實際的程式碼可以下載。
你好 其實採用sessionId的類似方式 我以前用ASP寫聊天室的
時候 就有想到過 不過那時候是擔心 sessionId是否會因為巧
合或client端使用者刻意修改而重覆 這樣就可以存取別的使用者的資料了
不過最近看到許多例子都提出用這個方式以避免cookie 被關掉
而sessionId設定的複雜、長一點的話 也很難重覆到 不知道是
不是我太鑽牛角尖 顧慮的太細了
仔細看你提的例子 似乎還有加上ip的檢查 而在同一個NET閘道
器裡連出去連線 IP雖然相同 但是sessionId又重覆的機率就
更低了 如此似乎就沒有問題了
session除了可以存db外
還有可以儲存於 na(不過不建議,會有檔案IO lock的問題吧)
還有一種是儲存於memcached這個東西,有興趣的人可以上google去 search 一下 (ToT)
想要請教幾個問題,謝謝.
1.若在session table中active_on超過一定時間沒有變動的就可以移除,但是移除的動作還是必須要寫一支程式來判斷時間,才能移除掉是吧.而且這支程式也要每隔一段時間執行一次,才可以把沒有變化的session刪除.
2.我想要用session來判斷一筆record不能同時被兩個使用者編輯,是否只要判斷session table就可以了.
Mark:
1.如果是 php 的話,有 session handler 可以用,不用再額外定時清理。或是在存取 session 前一併做清理的動作。
2.看如何規畫囉,可以另外新增一個表單或欄位來存放目前編輯中的使用者id。
Neo
謝謝Neo
關於避免同一record被兩個使用者編輯,若是不用session,改用另一table紀錄record與使用者,假如使用者開啟編輯中,未正常submit,例如submit前就關閉視窗,會不會將此record lock住,導致後續無法正常運作.