|
session 是一種服務器端用于存儲有關用戶會話信息的機制,服務器使用一種類似于散列表的結構,也可能就是使用散列表,來保存信息. 當程序需要為某個客戶端的請求創(chuàng)建一個 session 的時候,服務器首先會檢查這個客戶端是否已經包含了一個 session 標識,這個我們稱為 session id(獲取方法為 session_id()),如果已包含一個 session id 則說明此客戶端之前已經創(chuàng)建過 session,服務器則按照 session id 把這個 session 中的值檢索出來,如果客戶端不包含 session id,說明此客戶端第一次請求服務器或手動清除過緩存文件,則為此客戶端創(chuàng)建一個 session 并且生成一個與此 session 相關聯的 session id,一般來說,session id 的值是不會重復的,并且加密的字符串,這個 session id 將被在本次響應中返回給客戶端保存. session 在何時被創(chuàng)建? 通常(是指通常)是在瀏覽器向服務器端第一次請求時被創(chuàng)建,并且它會占用一定的內存空間,因此在不必要的情況下,盡最關閉 session. session 何時被刪除 通常情況下,session 在會在這幾種情況下被刪除,一是使用 session_destroy() 重置函數手動刪除,二是 session 的上次活動時間距離當前時間的間隔超過了 session 的超時設置的時間,三是服務器進程被停止. 怎么在瀏覽器關閉時刪除 session 理論上來說,是做不到這一點,http是一種無狀態(tài)協議,因此服務器不知道客戶端什么時候關掉的瀏覽器,并且PHP也沒有一個關相的函數來獲取此項信息,但這個問題還可以得到解決,就是使用代碼 window.oncolose 來監(jiān)視瀏覽器的關閉動作,然后用Ajax向服務器端發(fā)送一個請求來刪除 session,但這個辦法也并不會完全解決問題,原因是在有些情況下比如瀏覽器崩潰、突然斷電、用戶死機等這些時候并不能作出反應。 在PHP中有關Session的函數比較多,不過我們最常用到的也就這么幾個函數: session_start(), session_register(),session_unregister(), session_is_registered(),session_destroy函數. session_start():啟用session機制,在需要用到session的程序文件的最開始調用它. session_register():注冊session變量 session_unregister(): 刪除session變量(一個一個刪除) session_is_registered(): 判斷session變量是否注冊 session_distroy(): 銷毀所有session變量(所有session變量銷毀) 我們來看一下驗證程序,假設數據庫存儲的是用戶名和 md5 加密后的密碼,代碼如下: // 表單提交后... 我們在需要用戶驗證的頁面啟動 Session,判斷是否登陸,代碼如下: // 防止全局變量造成安全隱患 需要注意下面幾個方面: 1.函數session_start()必須在程序最開始執(zhí)行,在其前面不能有任何輸出內容,否則就會出現“Warning:Cannot send session cookie - headers already sent'類似這樣的警告信息. 2.函數session_register()用于注冊要保存在session中的相關變量,其用法如下: $val = 'session value'; val即為要注冊的session變量名,在注冊時一定不要加上'$'符號,只寫其變量名稱即可. 3.函數session_unregister()與上面函數用法完全相同,但功能相反,上面函數是注冊session變量,而其則是刪除指定的session變量. 4.函數session_is_registered()用于判斷session變量是否注冊. 5.函數session_destroy()主要用于在系統注銷和退出時,銷毀所有的session變量,它沒有參數,直接調用即可. |
|
|