Session的中文譯名為做“會話”,其本來的含義是指有始有終的一系列動作/消息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列過程可以稱之為一個Session。目前社會上對Session的理解非常混亂:有時候我們可以看到這樣的話“在一個瀏覽器會話期間,...”,這裡的會話是指從一個瀏覽器視窗打開到關閉這個期間;也可以看到「使用者(客戶端)在一次會話期間」這樣一句話,它可能指使用者的一系列動作(一般情況下是同某個具體目的相關的一系列動作,例如從登入到選購商品到結帳登
出這樣一個網上購物的過程;然而有時候也可能僅僅是指一次連接;其中的差別只能靠上下文
來推斷了。
連接」和/或「保持狀態」這樣兩個含義,「面向連接」指的是在通信雙方在通信之前要先建立一個通信的渠道,比如打電話,直到對方接了電話通信才能開始。「保持狀態」則是指通信的一方能夠把一系列的消息關聯起來,使得消息之間可以互相依賴,比如一個服務員能夠認出再次光臨的老顧客並且記得上次這個顧客還欠店裡一塊錢。這一類的例子有「一個TCP Session」或「一個POP3 Session」
。靠上下文來推斷理解了。 Session。
,
即所謂的會話ID。
服務端完成回應之後,伺服器就失去了與該瀏覽器的聯繫。必要紀錄彼此過去的行為,每一次請求之間都是獨立的,好比一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關係一樣
。種解決辦法)記錄使用者的相關訊息,以供使用者再次以此身分對web伺服器提起請求時作確認。這樣的體會,每一頁中的變數是不能在下一頁使用的(雖然form,url也可以實現,但這都是非常不理想的辦法),而Session中註冊的變數就可以作為全域變數使用了。
那麼Session到底有什麼用處呢?網上購物時大家都用過購物車,你可以隨時把你選購的商品加入購物車中,最後再去收銀台結帳。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,用它追蹤用戶在網站上的活動情況,這就是Session的作用,它可以用於用戶身份認證,程序狀態記錄,頁面之間參數傳遞等。
Session的實作中採用COOKIE技術,Session會在客戶端保存一個包含Session_id(Session編號)的COOKIE;在伺服器端保存其他Session變量,例如Session_name等等。當使用者請求伺服器時也把Session_id一起傳送到伺服器,透過Session_id提取所保存在伺服器端的變量,就能辨識出使用者是誰了。同時也不難理解為什麼Session有時會失效了。
當客戶端停用COOKIE時(點擊IE中的“工具”—“Internet選項”,在彈出的對話框裡點擊“安全”—“自訂等級”項,將“允許每個對話COOKIE”設為停用) ,Session_id將無法傳遞,此時Session失效。不過php5在linux/unix平台可以自動檢查cookie狀態,如果客戶端設定了停用,則系統自動把Session_id附加到url上傳遞。 windows主機則無此功能。
Session常見函數及用法
Session_start() :開始一個會話或傳回已經存在的會話。
說明:這個函數沒有參數,且傳回值均為true。如果你使用基於cookie的Session(cookie-based Sessions),那麼在使用Session_start()之前瀏覽器不能有任何輸出,否則會發生以下錯誤:
Warning: Cannot send Session cache limiter - headers already sent (output started at / usr/local/apache/htdocs/cga/member/1.php:2)…
你可以在php.ini啟動Session.auto_start=1,這樣就不需要每次使用Session之前都要呼叫Session_start()。但啟用該選項也有一些限制,如果確實啟用了Session.auto_start,則不能將物件放入會話中,因為類別定義必須在啟動會話之前載入以在會話中重建物件。
請求結束後所有註冊的變數都會被序列化。已註冊但未定義的變數被標記為未定義。在之後的存取中這些變數也未被會話模組定義,除非使用者以後定義它們。
有些類型的資料不能被序列化因此也不能保存在會話中。包括resource 變數或有循環引用的物件(即某物件將一個指向自己的參考傳遞給另一個物件)。