本文介紹了PHP會話控制,主要闡述以下幾點內容:
• 會話控制的產生背景/概念
• cookie的維護與生命周期(有效時間)
• session的維護與生命周期(回收機制)
• cookie與session之間的區別與聯系
• 問題1:禁用cookie后session為什么會失效?
• 問題2:IE瀏覽器下丟失session,每次刷新頁面,都會生成新的sessionID(Firefox瀏覽器正常)
• session、cookie簡單實例
理解會話控制的概念
理解一個概念就需要理解他的背景及產生的原因,這里引入WEB環境及其HTTP協議。會話控制產生的背景:
閱讀過HTTP協議相關資料的同學都會知道HTTP協議是WEB服務器與客戶端(瀏覽器)相互通信的協議,它是一種無狀態協議,所謂無狀態,指的是不會維護http請求數據,http請求是獨立的,不持久的。也就是說HTTP協議沒有一個內建的機制來維護兩個事務之間的狀態或者說是關系吧。當一個用戶在請求一個頁面后再去請求另外一個頁面時,HTTP將無法告訴我們這兩個請求是否來自同一個用戶。
由此我們就會覺得很奇怪了,平時我們在論壇逛帖子或電商網站購物時,只要我們在這個站點內,不論我們怎么跳轉,從一個頁面跑到另一個頁面,網站總會記得我是誰,比如告訴你購買了哪些東西。這是怎么做到的呢,估計大家猜到了,這就是運用了HTTP會話控制。在網站中跟蹤一個變量,通過對變量的跟蹤,使多個請求事物之間建立聯系,根據授權和用戶身份顯示不同的內容、不同頁面。
PHP Session會話控制:
PHP的session會話是通過唯一的會話ID來驅動的,會話ID是一個加密的隨機數字,由PHP生成,在會話的生命周期中都會保存在客戶端。我們知道客戶端(也就是瀏覽器)保存數據的地方只有cookie,所以PHP的會話ID一般保存在用戶機器的cookie中。了解cookie后我們知道,瀏覽器是可以禁用cookie的,這樣會話就會失效。所以PHP會話控制還有一種模式,就是在URL中傳遞會話ID。如果在瀏覽網站時我們稍加留心的話,有些URL中有一串看起來像隨機數字的字符串,那么其實很有可能就是URL形式的會話控制。
講到這里,有些人可能會有疑問了,客戶端只是保存一個會話ID,那么會話控制中保存的會話變量比如你購物時買的物品列表等,它們是存放在哪個地方的呢?很顯然,會話變量是在服務器端使用的,那么這些會話變量必定存放在服務器端。默認情況下,會話變量保存在服務器的普通文件中(也可以自己配置使用數據庫來保存,可以Google一下),會話ID的作用就像是一把鑰匙,在服務器端保存會話的文件中找到該會話ID對應的會話變量,比如購買物品的列表。
那么會話控制的整個過程可能就像這個樣子,用戶登錄或者第一次瀏覽某個站點的頁面時,該站點會生成一個PHP的會話ID并通過cookie發送到客戶端(瀏覽器)。當用戶點擊該站點的另一個頁面時,瀏覽器開始連接這個URL。在連接之前,瀏覽器會先搜索本地保存的cookie,如果在cookie中有任何與正在連接的URL相關的cookie,就將它提交到服務器。而剛好在登陸或第一次連接時,已經產生了一個與該網站URL相關的cookie(保存的會話ID),所以當用戶再次連接這個站點時,站點就可以通過這個會話ID識別出用戶,從服務器的會話文件中取出與這個會話ID相關的會話變量,從而保持事務之間的連續。
接下來我們了解下兩個重要的概念:cookie和session
關于cookie的維護與生命周期
cookie是在服務器端被創建并寫回到客戶端瀏覽器,瀏覽器接到響應頭中關于寫cookie的指令則在本地臨時文件夾中。
創建了一個cookie文件,其中保存了你的cookie內容,cookie內容的存儲是鍵值對的方式,鍵和值都只能是字符串。例如:
文件:Cookie:administrator@localhost/
內容格式:voteID100101localhost/15361167667230343893360385046430343691*
cookie的創建:
代碼如下:
setcookie()函數設置cookie,函數原型如下
setcookie(name, value, expire, path, domain);
注釋:cookie標題頭必須在發送其他標題頭之前發送,否則就無效(這是cookie的限制,而不是PHP的限制)。在發送 cookie 時,cookie 的值會自動進行 URL 編碼,在取回時進行自動解碼(為防止 URL 編碼,請使用 setrawcookie() 取而代之)。
cookie的維護:
cooke有四個標識符:cookie的name,domain,path,secure標記。要想在將來改變這個cookie的值,需要發送另一個具有相同cookie name,domain,path的Set-Cookie消息頭,這將以一個新
的值來覆蓋原來cookie的值。然而,如果僅僅只是改變這些選項的某一個也會創建一個完全不同的cookie,如只是更改了name值。
cookie失效時間:
可以設置過期時間,如果不設置則是會話級別的,即關閉瀏覽器就會消失。當cookie創建時包含了失效日期,這個失效日期則關聯了以name-domain-path-secure為標識的cookie。要改變一個cookie的失效日期,你必須指定同樣的組合。當改變一個cookie的值時,你不必每次都設置失效日期,因為它不是cookie標識信息的組成部分。例如:
代碼如下:
setcookie(vote ,$id+1,time()+3600*24);
setcookie(vote,$id);
在cookie上的失效日期并沒有改變,因為cookie的標識符是相同的。實際上,只有你手工的改變cookie的失效日期,否則其失效日期不會改變。這意味著在同一個會話中,一個會話cookie可以變成一個持久化cookie(一個可以在多個會話中存在的),反之則不可。為了要將一個持久化cookie變為一個會話cookie,你必須刪除這個持久化cookie,這只要設置它的失效日期為過去某個時間之后再創建一個同名的會話cookie就可以實現。
需要記得的是失效日期是以瀏覽器運行的電腦上的系統時間為基準進行核實的。沒有任何辦法來來驗證這個系統時間是否和服務器的時間同步,所以當服務器時間和瀏覽器所處系統時間存在差異時這樣的設置會出現錯誤。
cookie自動刪除:
cookie會被瀏覽器自動刪除,通常存在以下幾種原因:
會話cooke(Session cookie)在會話結束時(瀏覽器關閉)會被刪除
持久化cookie(Persistent cookie)在到達失效日期時會被刪除,如:
代碼如下:
setcookie("vote", "", time()-3600);
如果瀏覽器中的cookie限制到達,那么cookies會被刪除以為新建cookies創建空間。
新聞熱點
疑難解答