(PHP 4, PHP 5, PHP 7, PHP 8)
session_destroy — 銷(xiāo)毀一個(gè)會(huì )話(huà)中的全部數據
session_destroy() 銷(xiāo)毀當前會(huì )話(huà)中的全部數據, 但是不會(huì )重置當前會(huì )話(huà)所關(guān)聯(lián)的全局變量, 也不會(huì )重置會(huì )話(huà) cookie。 如果需要再次使用會(huì )話(huà)變量, 必須重新調用 session_start() 函數。
注意: 通常情況下,在你的代碼中不必調用 session_destroy() 函數, 可以直接清除 $_SESSION 數組中的數據來(lái)實(shí)現會(huì )話(huà)數據清理。
為了徹底銷(xiāo)毀會(huì )話(huà),必須同時(shí)重置會(huì )話(huà) ID。 如果是通過(guò) cookie 方式傳送會(huì )話(huà) ID 的,那么同時(shí)也需要 調用 setcookie() 函數來(lái) 刪除客戶(hù)端的會(huì )話(huà) cookie。
當啟用了 session.use_strict_mode 配置項的時(shí)候,你不需要刪除過(guò)期會(huì )話(huà) ID 對應的 cookie, 因為會(huì )話(huà)模塊已經(jīng)不再接受攜帶過(guò)期會(huì )話(huà) ID 的 cookie 了, 然后它會(huì )生成一個(gè)新的會(huì )話(huà) ID cookie。 建議所有的站點(diǎn)都啟用 session.use_strict_mode 配置項。
過(guò)早的刪除會(huì )話(huà)中的數據可能會(huì )導致不可預期的結果。 例如,當存在從 JavaScript 或者 URL 鏈接過(guò)來(lái)的并發(fā)請求的時(shí)候, 某一個(gè)請求刪除了會(huì )話(huà)中的數據,會(huì )導致其他的并發(fā)請求無(wú)法使用會(huì )話(huà)數據。
雖然當前的會(huì )話(huà)處理模塊不會(huì )接受為空的會(huì )話(huà) ID, 但是由于客戶(hù)端(瀏覽器)的處理方式, 立即刪除會(huì )話(huà)中的數據可能會(huì )導致生成為空的會(huì )話(huà) cookie, 進(jìn)而導致客戶(hù)端生成很多不必要的會(huì )話(huà) ID cookie。
為了避免這種情況的發(fā)生,你需要在 $_SESSION 中設置一個(gè)時(shí)間戳, 在這個(gè)時(shí)間戳之后的對于會(huì )話(huà)的訪(fǎng)問(wèn)都將被拒絕。 或者,確保你的應用中不存在并發(fā)請求。 這個(gè)規則同樣適用于 session_regenerate_id()。
成功時(shí)返回 true
, 或者在失敗時(shí)返回 false
。
示例 #1 銷(xiāo)毀會(huì )話(huà)數據以及 $_SESSION
<?php
// 初始化會(huì )話(huà)。
// 如果要使用會(huì )話(huà),別忘了現在就調用:
session_start();
// 重置會(huì )話(huà)中的所有變量
$_SESSION = array();
// 如果要清理的更徹底,那么同時(shí)刪除會(huì )話(huà) cookie
// 注意:這樣不但銷(xiāo)毀了會(huì )話(huà)中的數據,還同時(shí)銷(xiāo)毀了會(huì )話(huà)本身
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 最后,銷(xiāo)毀會(huì )話(huà)
session_destroy();
?>
注意:
對于舊版本中不使用 $_SESSION 的代碼, 僅能使用 session_unset() 來(lái)完成會(huì )話(huà)銷(xiāo)毀工作。