用 MySQL 建立跨平台語言的 Session 及 ASP 的 Application 功能

隨著 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住,導致後續無法正常運作.

Leave a reply:

Your email address will not be published.

Site Footer

Sliding Sidebar