如果您希望在每次登录时更改会话 ID,请确保在登录过程中使用 session_regenerate_id(true)。
<?php
session_start();
session_regenerate_id(true);
?>
[由主持人(googleguy at php dot net)编辑]
(PHP 4, PHP 5, PHP 7, PHP 8)
session_destroy — 销毁所有注册到会话的数据
session_destroy() 销毁与当前会话关联的所有数据。它不会取消设置与会话关联的任何全局变量,也不会取消设置会话 Cookie。要再次使用会话变量,必须调用 session_start()。
注意: 您不必从常规代码中调用 session_destroy()。清理 $_SESSION 数组,而不是销毁会话数据。
为了完全终止会话,还必须取消设置会话 ID。如果使用 Cookie 传播会话 ID(默认行为),则必须删除会话 Cookie。setcookie() 可用于此目的。
当 session.use_strict_mode 启用时。您不必删除过时的会话 ID Cookie,因为当会话 ID Cookie 关联的数据不存在时,会话模块将不会接受会话 ID Cookie,并设置新的会话 ID Cookie。对于所有站点,建议启用 session.use_strict_mode。
立即删除会话可能会导致意外结果。当存在并发请求时,其他连接可能会看到突然的会话数据丢失。例如:来自 JavaScript 的请求和/或来自 URL 链接的请求。
虽然当前的会话模块不接受空会话 ID Cookie,但由于客户端(浏览器)方面的竞争条件,立即删除会话可能会导致空会话 ID Cookie。这将导致客户端无端地创建许多会话 ID。
为了避免这些问题,您必须将删除时间戳设置为 $_SESSION,并在稍后拒绝访问。或者确保您的应用程序没有并发请求。这也适用于 session_regenerate_id()。
此函数没有参数。
示例 #1 使用 $_SESSION 销毁会话
<?php
// 初始化会话。
// 如果您使用 session_name("something"),请不要忘记现在使用它!
session_start();
// 取消设置所有会话变量。
$_SESSION = array();
// 如果需要终止会话,还需删除会话 Cookie。
// 注意:这将销毁会话,而不仅仅是会话数据!
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_destroy();
?>
如果您希望在每次登录时更改会话 ID,请确保在登录过程中使用 session_regenerate_id(true)。
<?php
session_start();
session_regenerate_id(true);
?>
[由主持人(googleguy at php dot net)编辑]
我花了一段时间才弄清楚如何在 php 中销毁特定会话。请注意,我不确定下面提供的解决方案是否完美,但它似乎对我有用。请随时发布任何更简单的方法来销毁特定会话。因为这对于强制用户离线的功能非常有用。
1. 如果您使用 db 或 memcached 来管理会话,您始终可以直接从 db 或 memcached 中删除该会话条目。
2. 使用通用的 php 会话方法来删除特定会话(按会话 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();
?>
我使用的是 PHP 7.1,并在实施上面的示例 #1 时收到了以下警告
PHP 消息:PHP 警告:session_destroy(): 尝试销毁未初始化的会话 in...
我发现,清除 $_SESSION 并删除 Cookie 会销毁会话,因此会发出警告。为了避免在仍然保持使用 session_destroy() 的值的同时发出警告,请在其他所有操作之后执行此操作
if (session_status() == PHP_SESSION_ACTIVE) { session_destroy(); }
突然之间,session_destroy() 和 $_SESSION=[] 都无法正常注销。我发现以下方法可以解决问题
<?php
setcookie(session_name(), session_id(), 1); // 使会话过期
$_SESSION = [];
?>