2024 年日本 PHP 研討會

session_destroy

(PHP 4, PHP 5, PHP 7, PHP 8)

session_destroy銷毀所有已註冊到工作階段的資料

說明

session_destroy(): 布林值

session_destroy() 會銷毀與目前工作階段關聯的所有資料。它不會取消設定任何與工作階段關聯的全域變數,也不會取消設定工作階段 Cookie。要再次使用工作階段變數,必須呼叫 session_start()

注意一般程式碼中不需要呼叫 session_destroy()。清理 $_SESSION 陣列即可,而不是銷毀工作階段資料。

若要完全終止工作階段,也必須取消設定工作階段 ID。如果使用 Cookie 來傳播工作階段 ID(預設行為),則必須刪除工作階段 Cookie。可以使用 setcookie() 來完成此操作。

當啟用 session.use_strict_mode 時,您不需要移除過時的工作階段 ID Cookie,因為當沒有與工作階段 ID 關聯的資料時,工作階段模組將不會接受工作階段 ID Cookie,並會設定新的工作階段 ID Cookie。建議所有網站都啟用 session.use_strict_mode

警告

立即刪除工作階段可能會導致非預期的結果。當存在並行請求時,其他連線可能會看到工作階段資料突然遺失。例如,來自 JavaScript 的請求和/或來自網址連結的請求。

雖然目前的工作階段模組不接受空白的工作階段 ID Cookie,但由於用戶端(瀏覽器)端的競爭條件,立即刪除工作階段可能會導致空白的工作階段 ID Cookie。這將導致用戶端不必要地建立許多工作階段 ID。

為了避免這些情況,您必須在 $_SESSION 中設定刪除時間戳記,並在稍後拒絕存取。或者確保您的應用程式沒有並行請求。這也適用於 session_regenerate_id()

參數

此函式沒有參數。

傳回值

成功時傳回 true,失敗時傳回 false

範例

範例 #1 使用 $_SESSION 銷毀工作階段

<?php
// 初始化 Session。
// 如果您使用了 session_name("something"),請記得在這裡也要使用!
session_start();

// 清除所有 Session 變數。
$_SESSION = array();

// 如果要完全終止 Session,也要刪除 Session Cookie。
// 注意:這會銷毀整個 Session,而不只是 Session 資料!
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}

// 最後,銷毀 Session。
session_destroy();
?>

另請參閱

新增註解

使用者貢獻的註解 3 則註解

Praveen V
12 年前
如果您希望每次登入時都更改 Session ID,請確保在登入過程中使用 session_regenerate_id(true)。

<?php
session_start
();
session_regenerate_id(true);
?>

[由版主 (googleguy at php dot net) 編輯]
Jack Luo
10 年前
我花了一段時間才弄清楚如何在 PHP 中銷毀特定的 Session。我不確定以下提供的解決方案是否完美,但它似乎對我有效。如果您知道任何更簡單的方法來銷毀特定 Session,請隨時發表。因為這對於強制使用者離線的功能非常有用。

1. 如果您使用資料庫或 memcached 來管理 Session,您可以隨時直接從資料庫或 memcached 中刪除該 Session 項目。

2. 使用通用的 PHP Session 方法來刪除特定 Session(透過 Session ID)。

<?php
$session_id_to_destroy
= 'nill2if998vhplq9f3pj08vjb1';
// 1. 若工作階段已啟動,則提交工作階段。
if (session_id()) {
session_commit();
}

// 2. 儲存目前的工作階段 ID
session_start();
$current_session_id = session_id();
session_commit();

// 3. 綁架然後銷毀指定的工作階段。
session_id($session_id_to_destroy);
session_start();
session_destroy();
session_commit();

// 4. 還原目前的工作階段 ID。如果不還原,目前的工作階段將會指向剛剛銷毀的工作階段!
session_id($current_session_id);
session_start();
session_commit();

?>
vitas dot lowang at gmail dot com
14 天前
我發現為了在呼叫 session_destroy() 之後真正清除工作階段資料,您需要重新整理頁面。例如,透過呼叫
header('Location: '.$_SERVER['PHP_SELF']."?page=profile");

如果不這樣做,$_SESSION 中仍然存在之前的資料。我不知道這是否是預期的行為,但我認為這有點令人困惑...
To Top