PHP中Session會話的使用和分析_PHP教程

來源:互聯網
上載者:User
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選項”,在彈出的對話方塊裡點擊“安全”—“自訂層級”項,將“允許每個對話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 變數或者有循環參考的對象(即某對象將一個指向自己的引用傳遞給另一個對象)。


http://www.bkjia.com/PHPjc/446675.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/446675.htmlTechArticleSession的中文譯名叫做“會話”,其本來的含義是指有始有終的一系列動作/訊息,比如打電話時從拿起電話撥號到掛斷電話這中間的一系列...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.