2012-03-02 207 views
5

session_destroy()函數做什麼?要刪除全局數組$ _SESSION中的所有會話變量,我必須使用session_unset()。要從客戶端瀏覽器會話(刪除會話ID和姓名),我不得不取消設置的cookie:爲什麼需要session_ destroy()?

unset($_COOKIES[session_id()]); 
unset($_COOKIES[session_name()]); 

爲什麼需要session_destroy()功能?

+0

http://us.php.net/manual/en/function.session-destroy.php – 2012-03-02 18:51:46

+0

非常感謝你,我讀過幾次,但無法理解它做什麼。爲什麼它不會真正破壞會議。要銷燬會話,我必須再使用兩個步驟。但實際上,session_destroy()應該爲我完成這些步驟。 – Green 2012-03-02 18:56:26

+2

如果*另一個代碼*的答案爲您提供了所需的信息(我看不出它是怎麼回事),請您接受它?通常情況下,這是如何完成的:p – RobinJ 2012-03-04 10:49:42

回答

11

session_destroy()結束整個會話,這意味着它將從PHP的會話存儲中刪除,並且不能再次使用。如果您只會取消設置會話變量和cookie,那麼會話仍然是活動的服務器端,並且如果再次設置一些會話變量並將具有原始會話ID的Cookie再次發送到客戶端,則可能會被回收。

換句話說:會話基本上包含一個存儲在Web服務器某處的祕密ID,以及註冊到該會話的會話變量。會話ID被髮送到客戶端(通常作爲cookie),以便客戶端可以在以後的請求中被識別爲會話的「擁有者」。假設會話已經建立並已註冊到它的變量,這裏是一個什麼樣的功能做一個概述:

  • session_start()進口屬於該客戶端從會話註冊表發送到$_SESSION會話ID的所有會話變量陣列
  • session_unset()或致電unset()$_SESSION變量將清除註冊到當前會話的所有變量,但它不會明確會議本身
  • 取消設置客戶端的會話cookie將信號到CLI耳鼻喉科,本次會議已經結束,但服務器或者
  • session_destroy()這個不會從會話註冊表中刪除會話是將實際從會議註冊表清除會話,從而從字面上「摧毀」了會議的唯一功能

雖然session_destroy()將註銷所有會話變量,它不會清除,因此目前執行腳本的$_SESSION陣列,所以它仍然是取消設置會話變量,以防止bug和安全問題是一個好主意。

相關提示,PHP手冊建議不要使用session_unset()而是從取消設置的$_SESSION鍵:

如果$_SESSION(或$HTTP_SESSION_VARS對於PHP 4.0.6或以下)時,使用unset()來取消註冊會話變量,即unset($_SESSION['varname']);

+0

'僅對不使用$ _SESSION的舊版棄用代碼使用session_unset()。' 要釋放所有SESSION VARIABLES,請使用: '$ _SESSION = array()' – MTVS 2012-11-05 16:18:44