php session技術測試使用小結

在http無狀態協議框架下,服務器無法確定客戶的身份,毫無疑問,這不能滿足所有需求。session技術目前應該是彌補無狀態協議的最好方式(之一?) 。Session已經得到普遍支持,從語言方面來說,asp,java,php等都有Session技術的具體實現,這裏主要寫下我用PHP的Session實現技術,其他應該基本類似。

Session是一種服務器端技術,但他也可能需要客戶端協作。當客戶端同服務器連接上後,服務器將會給該客戶分配一個隨機的ID,稱爲SID(Session ID),因爲是隨機產生的(並且很長),實際上保證了唯一性,這樣,服務器就可以識別客戶。這一過程通過服務器端調用session_start實現,(默認)這將會產生一個session文件,(默認)在/tmp下,文件名包含了SID,文件內容是服務器寫的字段,比如記錄用戶名稱,用戶喜好等等。當然也可以將這些寫入數據庫,具體就不說了。

既然http是無狀態的,那麼下一次客戶端訪問服務器,服務器怎麼知道它是誰呢?很顯然,客戶端必須告訴服務器特定的信息,這就是前面生成的SID.那麼客戶端又是怎麼得到這個SID的呢,也很顯然,服務器發給它:這裏有兩種方式------一種是基於Cookie技術, 服務器在生成SID的時候將SID寫入Cookie並隨http頭一同發送給客戶,客戶以後每次再訪問服務器時將附帶此Cookie。Cookie分爲會話Cookie和永久Cookie,前者在內存中,在客戶端重啓後將消失,後者將寫入客戶端磁盤,所以即便重啓客戶端,只要沒有過期,仍然可用(至於Cookie期限可由服務器端在生成Cookie時設置)。但是客戶端有可能不支持Cookie,或者有意禁掉,這種情況下還有第二種方式,所謂Url重寫,即服務器在url中加上SID作爲查詢參數(或類似)。

服務器端使用Session變量(即寫入Session文件中的變量)非常簡單,像普通超級變量一樣---$_SESSION['name'],可以通過讀取這些變量獲知客戶身份,喜好等等。如果缺乏相應變量,那麼就可以判斷用戶沒有登錄或者用戶不具有某種特徵。

通過實驗做出如下判斷:在客戶端沒有提交SID的情況下(包括通過Cookie或Url重寫方式,另外一種所謂隱藏技術已不被推薦),服務器端調用session_start將會產生新的Session。如果客戶端提交了SID,那麼session_start將會檢查是否存在該SID對應的Session,如果沒有的話將會新建該Session,如果有的話則繼續使用。所以即便將服務器端Session文件刪掉,當客戶端再次請求還是會生成相同文件(不過內容爲空了)。

最後要記住的是,要需要使用會話變量時,必須一開始在文件頭調用session_start.

關於session關閉就不細述了。有空再寫...^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章