稍微大型一 ASP 的人都知道,Session 物件真是好用,它可以用 使用者私有的 料 ,既安全又方便。但是你真的知道 Session 的 作原理 ?或 了解以後,你就再也不太敢使用 令人又 又恨的物件。 然 而替代之的方法稍嫌麻 ,但在 期考量之下,也就不得不 做了。 首先 Session 的好 ,它可以用 用 端私有的 料 , 且在 不 消失。 真的是很重要的功能,尤其是有 的系 必 要用到的。像是 的登入 、 、 以及 多多 的即 料 如 物系 使用者的 物 的商品 , 些 於各使用者私人所需要,通常 者都是使用 Session 理。
然而,在 ASP 中的 Session 是使用 Cookies 所 成,伺服器 所有的 Session 的 料,以 Cookies 的方式 至用 的 器。通常一般 器 些 Cookies 存起 ,每 使用者 ,再次 伺服器做 , 器就 把 些 Cookies 回 Server 供做 理。 即是 Session 的 作原理, 料量大一 ,由於必 出去又收回 ,不但吃 路 ,效能相 降低,因 Server 必 花 更多的 源在做 理和重新配置 等初始 作。 在你可能 想『我必 用 功能,只好 牲 了』,不 本文 Session 一方面是教 大家少用;另一方面 然是有替代 法, 接著上 的,就是同 Global.asa 的 Application 物件。
Application 也是 理 料的好手,各方面的能力和用法都和 Session 一 ,只不 相 之下,它所 的 料是 於公用的,也就是任何使用者都可以共用的 空 。Application 不像 Session ,不是 料 使用者,等下一次 再 取回 ,它是直接 在 Server 上的 ,相 之下效能上快上 Session 多。
由於 Application 物件是公用的,首先必 做的,就是要把一 公用的 域 各 使用者, 每 用 有自己的 域可以 料,以 到模 Session 的目的。 在有 做法:一、在 Server 事先初始化建立及分配使用者 空 ,通常 做法 然一 Server 就先 了 多 源,但也省去了以後每 使用者 就必 做一次分配的麻 。但有 限制,使用 方法必 限制最大人 ,由於是一 就初始化,我 只能 估建立某 量的 空 ,所以 方法通常用於聊天室 小型的程式上。二、 方法 於大型 用程式 算 恰 的, 用 的分配法, 使用者第一次 到 Server 上才 始分配 源 此用 。 模 Session 的方案,目的都是 Session 源的消耗,但 竟 是 法完全替代,我 是需要使用到一 Session,至少 Server 已 能 不少 了。
■第一方案
首先我 始第一 方案的 作,由於是 初始化 Application,我 然要 Global.asa中著手:
<SCRIPT LANGUAGE="VBScript" RunAt="Server">'Global.asa'Server 行Sub Application_OnStart() Dim i ' 定最大上限人 50 人 Application("ClientMax") = 50 ' 50 人事先建立 空 For i = 1 To Application("ClientMax") ' 此 空 是否遭已使用 Application("User_Status_" & i) = 0 '建立 空 : 、登入 Application("User_Account_" & i) = Empty Application("User_Logtime_" & i) = Empty NextEnd Sub</SCRIPT>
已 完成初始化了,但如何使用呢?我 只要在使用者登入的地方,把原本使用 Session 存的 料,如 、登入 ,改成我 建立好的 Application 物件中就可以了:
' 找未被使用的空 For i = 1 To Application("ClientMax") If Application("User_Status_" & i) = 0 Then '使用者 Session("Index") = i ' 定 Application Application.Lock ' 成已使用的 Application("User_Status_" & i) = 1 '放入 料 Application("User_Account_" & i) = Account Application("User_Logtime_" & i) = Now() '解除 定 Application.Unlock Exit For End IfNext
要取得使用者的相 料 就像下面的做法:
Response.Write(Application("User_Account_" & Session("Index"))
你可能 ,不是 不要使用 Session ?那 什 上面的原始 中 有 Session 的存在?前面也 , 替代方案 不能完全代替掉 Session, 器 不是一直和 Server 於 的, 取完 面就 ,那我 要怎 知道下次 的 是同一 人呢? 候就必 要靠 Session,我 使用者一 即 的 ,此 就是使用者於 Application 上 空 的 ,你可以想像成 行中有很多的保 箱,你 有一支 匙,而 匙上有 , 匙上的 可以 行 你去你自己的保 箱。此方法尚 有改 之 ,但 小型的 用程式已 是很 用了。
■第二方案
於上一方案,你可能也想到,我 自 的 使用了 Session , 到 ,Session 物件有提供一 『 SessionID 』方法。 ,不管我 要不要使用,Server 都 自 每 用 列 ,且此 不 重 ,至於 就是用 Session.SessionID 取得。 列 是 Session 一定 做的 作,我 就可利用它代替我 自己 的 程式,亦又省了一道功夫,甚至有更大的 充性。但基本上,上面的第一 方案 是有它的用途在,像是 限制人 的聊天室等等小 用程式,接下 的第二替代方案,就是 大型的系 了。
每秒上站人 百 千甚至上 人的 站,使用之前的方案,必定是行不通的。假 你 上限人 10000 ,Server 一 就 你切出一 域 一 使用者,假若一 域中有 5 ,一 32 位元 (Byte),10000 就 了 320000 K(320MB) 以上,Server 一 就塞了那 多的垃圾到 ,效能 必 上 就降低不少;而且 看 些 字很少,以 自己的 512 MB 用,上面的 字是假 一 最低 字,加上 Server 在配置 外使用到多少 源不得而知,所以只 更多不 更低。因此解 法只有 配置使用者 空 , 有使用者 Server 才切一 域出 ,如此便不 要事先就配置好 大 。
第二方案做起 是比 , 把第一方案的 西全部 掉,我 不需要 到 Global.asa,只需要改使用者登入的地方和其他有用到的地方:
' 定 ApplicationApplication.Lock '放入 料Application("User_Account_" & Session.SessionID) = AccountApplication("User_Logtime_" & Session.SessionID) = Now() '解除 定Application.Unlock
要取得使用者的相 料 就像下面的做法:
Response.Write(Application("User_Account_" & Session.SessionID))
以往看很多 ,都 著 Session 吃 源吃的很 , 量不要用,可是必 用的 候 是得用, 又都 教 妥 的解 法。 在 你懂了如何替代 Session,好好去利用吧!或 老是困 的效能 能因此改善不少! |