2011-10-12 58 views
4

有人說使用unset($_SESSION["..."]),有的說session_unset(),有的說$_SESSION = array(),有的說session_destroy(),我說「看在上帝的份上,這個東西越來越讓人困惑,有人可以請我解釋一下,這是登錄用戶的正確/安全的方式嗎? out「和什麼用於什麼?如何在PHP中過期用戶的會話?

讚賞...

回答

4
<?php 
// Initialize the session. 
// If you are using session_name("something"), don't forget it now! 
session_start(); 

// Unset all of the session variables. 
$_SESSION = array(); 

// If it's desired to kill the session, also delete the session cookie. 
// Note: This will destroy the session, and not just the session data! 
if (ini_get("session.use_cookies")) { 
    $params = session_get_cookie_params(); 
    setcookie(session_name(), '', time() - 42000, 
    $params["path"], $params["domain"], 
    $params["secure"], $params["httponly"] 
    ); 
} 

// Finally, destroy the session. 
session_destroy(); 
?> 

RTM

+0

+1更多的空會話和RTM參考。 –

+0

但是,爲什麼我們沒有使用'session_destroy()'來取消所有的$ _SESSION。 'session_destroy()'不會刪除所有的變量和數據? – Tarik

+1

當我們調用'session_start()''$ _SESSION'數組從服務器上的會話文件加載到RAM時 - 這是會話變量在請求之間保存的位置。 'session_destroy()'會刪除會話文件。它並不清除'$ _SESSION'數組。 – megaflop

0

的,僅僅說session_unset()是停留在PHP的版本過時了的 - 函數的被廢棄了很長一段時間了。

這個問題的確切答案取決於你的代碼用來確定某人是否「登錄」v。s。某人「退出」。

如果你有一個你的代碼尋找的單一的$_SESSION['logged_in'] = true,那麼爲什麼取消它呢?只需將其設置爲false並且boom ...用戶已註銷。

+0

我在[手冊](http://uk3.php.net/manual/en/function.session-unset.php)中沒有看到'session_unset()'被棄用的引用 - 你能引用這個嗎? ? – megaflop

+0

session_unset與session_register相反,不推薦使用。所有會話可變操作都應該直接在$ _SESSION上完成,並將其視爲一個常規數組。 –

+0

感謝您的信息。 TBH,我從來沒有使用'session_unset()'並且總是使用'$ _SESSION = array()'清除會話變量,因爲手冊中說我們應該:-) - 仍然,我看到'session_unregister()'_is_標記爲已棄用在手冊中,但沒有'session_unset()'的通知。 – megaflop

0

session_destroy - 銷燬註冊到會話
session_unset所有數據 - 免費所有會話變量

http://www.php.net/manual/en/book.session.php

我見過用的最多的是給他們打電話順序。

session_unset(); 
session_destroy(); 
$_SESSION = array(); 
1

這裏是實體之間的差異

可以在會話

unset($_SESSION['shape']); 

這將消除會話中的所有變量刪除一個變量,而不是會議本身

session_unset(); 

這會破壞會話變量

session_destroy(); 
1

首先,session_destroy()是不一樣的其他方法。這將破壞服務器上的當前會話數據,但不會取消設置任何變量。它只是session_start()的對應部分。

session_unset()deprecated相當於做$_SESSION = array()。後者和unset($_SESSION["..."])只有在unset()路由只會取消設置一個會話變量([...]中的一個)時纔會有所不同。切勿執行unset($_SESSION),因爲這會干擾會話機制本身。

Old question reference.

0

如果使用session_destroy()然後在瀏覽器中的cookie也cleard(和probbley一個新的會話之後被創建)

本人來說,我使用一個對象(或多個)以跟蹤不同的東西(如public loggedIn = False;和功能女巫actally登錄用戶)

session_unset()是方便,如果你想保持coockie,但你最終會與SOLU服務器

+0

'session_destroy()'對cookie不做任何事情 - 它刪除服務器上存儲的會話數據(即用於存儲會話變量的臨時文件)。它用於保持服務器端的乾淨,而不會過度依賴垃圾收集器。要刪除cookie,您需要將其值設置爲空字符串,並將其到期時間設置爲過去的時間。 – megaflop