php session的理解【轉】

php session的理解【轉】
一、什麼是session?php

  Session的中文譯名叫作「會話」,其原本的含義是指善始善終的一系列動做/消息,好比打電話時從拿起電話撥號到掛斷電話這中間的一系列過程能夠稱之爲一個session。目前社會上對session的理解很是混亂:有時候咱們能夠看到這樣的話「在一個瀏覽器會話期間,...」,這裏的會話是指從一個瀏覽器窗口打開到關閉這個期間;也能夠看到「用戶(客戶端)在一次會話期間」這樣一句話,它可能指用戶的一系列動做(通常狀況下是同某個具體目的相關的一系列動做,好比從登陸到選購商品到結帳登出這樣一個網上購物的過程;然而有時候也可能僅僅是指一次鏈接;其中的差異只能靠上下文來推斷了。
  然而當session一詞與網絡協議相關聯時,它又每每隱含了「面向鏈接」和/或「保持狀態」這樣兩個含義,「面向鏈接」指的是在通訊雙方在通訊以前要先創建一個通訊的渠道,好比打電話,直到對方接了電話通訊才能開始。「保持狀態」則是指通訊的一方可以把一系列的消息關聯起來,使得消息之間能夠互相依賴,好比一個服務員可以認出再次光臨的老顧客而且記得上次這個顧客還欠店裏一塊錢。這一類的例子有「一個TCP session」或者「一個POP3 session」。
  鑑於這種混亂已不可改變,要爲session下個定義就很難有統一的標準。而在閱讀session相關資料時,咱們也只有靠上下文來推斷理解了。不過咱們能夠這樣理解:例如咱們打電話,從撥通的那一刻起到掛斷電話期間,由於電話一直保持着接通的狀態,因此把這種接通的狀態叫作session。 它是訪客與整個網站交互過程當中一直存在的公有變量,在客戶端不支持COOKIE的時候,爲了保證數據正確、安全,就採用SESSION變量。訪問網站的來客會被分配一個惟一的標識符,即所謂的會話 ID。它要麼存放在客戶端的 cookie,要麼經由 URL 傳遞。
  SESSION的發明填補了HTTP協議的侷限:HTTP協議被認爲是無狀態協議,沒法得知用戶的瀏覽狀態,當它在服務端完成響應以後,服務器就失去了與該瀏覽器的聯繫。這與HTTP協議原本的目的是相符的,客戶端只須要簡單的向服務器請求下載某些文件,不管是客戶端仍是服務器都沒有必要紀錄彼此過去的行爲,每一次請求之間都是獨立的,比如一個顧客和一個自動售貨機或者一個普通的(非會員制)大賣場之間的關係同樣。
  所以經過SESSION(cookie是另一種解決辦法)記錄用戶的有關信息,以供用戶再次以此身份對web服務器提起請求時做確認。會話的發明使得一個用戶在多個頁面間切換時可以保存他的信息。網站編程人員都有這樣的體會,每一頁中的變量是不能在下一頁中使用的(雖然form,url也能夠實現,但這都是很是不理想的辦法),而SESSION中註冊的變量就能夠做爲全局變量使用了。
  那麼SESSION到底有什麼用處呢?網上購物時你們都用過購物車,你能夠隨時把你選購的商品加入到購物車中,最後再去收銀臺結賬。在整個過程當中購物車一直扮演着臨時存貯被選商品的角色,用它追蹤用戶在網站上的活動狀況,這就是SESSION的做用,它能夠用於用戶身份認證,程序狀態記錄,頁面之間參數傳遞等。
  SESSION 的實現中採用COOKIE技術,SESSION會在客戶端保存一個包含session_id(SESSION編號)的COOKIE;在服務器端保存其餘 session變量,好比session_name等等。當用戶請求服務器時也把session_id一塊兒發送到服務器,經過session_id提取所保存在服務器端的變量,就能識別用戶是誰了。同時也不難理解爲何SESSION有時會失效了。
  當客戶端禁用COOKIE時(點擊IE中的「工具」—「internet="">Internet選項」,在彈出的對話框裏點擊「安全」—「自定義級別」項,將「容許每一個對話COOKIE」設爲禁用),session_id將沒法傳遞,此時SESSION失效。不過php5在linux/unix平臺能夠自動檢查cookie狀態,若是客戶端設置了禁用,則系統自動把session_id附加到url上傳遞。windows主機則無此功能。linux

[danger] Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2)…………web

相關文章
相關標籤/搜索