我有一个非常基本的php会话登录脚本。我想强制某个用户注销或强制所有用户注销。
如何读取网站上的所有会话,并销毁部分或全部会话?
发布于 2011-03-04 22:33:25
您可以尝试通过执行以下操作强制PHP删除所有会话
ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
这迫使PHP将所有会话视为具有0秒生命周期,并且有100%被清理的可能性。
缺点是,无论哪个倒霉的用户第一次运行它,都会在PHP进行清理时得到长时间的停顿,特别是在有很多会话文件要处理的情况下。
对于一个特定的用户,您必须向您的会话处理程序添加一些代码:
if ($_SESSION['username'] == 'user to delete') {
session_destroy();
}
PHP的垃圾收集器是不可控制的,所以你不能给它参数,比如“删除除用户X之外的所有会话”。它严格查看会话文件上的最后修改/最后访问的时间戳,并将其与max_lifetime设置进行比较。它实际上并不处理会话数据。
发布于 2011-03-04 20:36:52
您可以使用session_save_path()
找到保存会话文件的路径,然后使用unlink()
删除它们。
发布于 2012-08-31 18:55:23
更新- 2012年8月
这段代码基于official PHP site和另一个写得很好的snippet on SO。
<?php
// Finds all server sessions
session_start();
// Stores in Array
$_SESSION = array();
// Swipe via memory
if (ini_get("session.use_cookies")) {
// Prepare and swipe cookies
$params = session_get_cookie_params();
// clear cookies and sessions
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// Just in case.. swipe these values too
ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
// Completely destroy our server sessions..
session_destroy();
?>
效果很好。像NGinx这样的服务器,你可以关闭,清理缓存,滑动内存重置,清除日志等,并通常删除临时使用。甚至可以降低内存的限制。
https://stackoverflow.com/questions/5193744
复制相似问题