站内搜索

披著羊皮的大野狼 - Session

  稍微大型一 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,好好去利用吧!或老是困的效能能因此改善不少!

  • 上一篇:插入Access记录后马上得到自动编号值的方法
  • 下一篇:怎么学习asp 给非专业的asp爱好者