如何杀死/所有php会话?

TDS*_*Sii 26 php session login

我有一个非常基本的php会话登录脚本.我想强制注销某个用户或强制注销所有用户.

如何阅读我网站上的所有会话,并销毁部分或全部会话?

Mar*_*c B 16

您可以尝试强制PHP删除所有会话

ini_set('session.gc_max_lifetime', 0);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
Run Code Online (Sandbox Code Playgroud)

这迫使PHP将所有会话视为具有0秒的生命周期,并且100%的概率被清除.

缺点是,当PHP执行清理时,无论哪个不幸的用户首先运行它都会得到一个长时间的暂停,特别是如果有很多会话文件需要通过.

对于一个特定用户,您必须向会话处理程序添加一些代码:

 if ($_SESSION['username'] == 'user to delete') {
     session_destroy();
 }
Run Code Online (Sandbox Code Playgroud)

PHP的垃圾收集器是不可控制的,因此您无法为其提供诸如"删除除用户X之外的所有会话"之类的参数.它严格查看会话文件上最后修改/最后访问的时间戳,并将其与max_lifetime设置进行比较.它实际上并不处理会话数据.

  • 在您的第二个代码中删除会话仅在本地进行。$_SESSION 变量独立于每个用户,我的目标是能够让所有用户的所有会话销毁曾经登录过的人 (2认同)
  • 是的,但你说你想要注销一个或所有用户.这些东西可以照顾每个人.if()负责特定用户. (2认同)

KAR*_*ván 6

这取决于您的会话存储。

如果您使用 PHP 会话存储,那么它们可能位于服务器的临时目录中。删除选定的文件将“终止”会话。但是,如果您的服务器处于运行状态,该会话文件可能被HTTP进程占用,您将无法删除它。看看下面的图片就知道了。以“+~”开头的文件都是会话文件。 会话被进程占用且无法删除的屏幕截图

更好的解决方案是使用数据库会话存储并从其中删除选定的会话。您可以查看HTTP_Session2哪个有多个容器


m4r*_*4rc 6

您可以使用session_save_path()查找PHP保存会话文件的路径,然后使用删除它们unlink()

  • 请注意,这会将所有用户从服务器上的所有帐户中注销。如果您在一台服务器上有多个域,并且您删除了具有 root 权限的会话文件,那么您将注销所有域上的所有用户。 (3认同)
  • 如果有问题的路径是全局/ tmp目录,请务必谨慎使用此方法!除了PHP在那里存储临时数据之外,肯定还有其他进程。如果PHP为会话数据保留了自己的目录,则它应该是相当安全的。 (2认同)
  • 显然这不是一个好习惯——但我只是给了这个人他想要的东西!:-p (2认同)
  • 这是 OP 所要求的最佳答案,除了它不解决 Session 未存储在文件系统上的系统(例如,在 KARASZI István 提到的数据库中)。 (2认同)

The*_*Kid 6

更新 - 2012年8月

此代码基于官方PHP站点,以及另一个写得很好的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();
?>
Run Code Online (Sandbox Code Playgroud)

效果很好.像NGinx这样的服务器你可以关闭,清理缓存,刷卡内存重置,清除日志等,并通常删除临时使用.甚至降低了记忆的极限.


She*_*rif 5

一次清除所有session.save_handler会话需要首先知道哪个会话用于存储会话并找到它session.save_path以便删除所有会话。对于仅删除当前会话,请参阅的文档session_destroy()

以下是使用标准文件和 memcached 保存处理程序删除所有会话的一些常见示例:

使用文件保存处理程序

foreach(glob(ini_get("session.save_path") . "/*") as $sessionFile) {
    unlink($sessionFile);
}
Run Code Online (Sandbox Code Playgroud)

使用 memcached 保存处理程序

$memcached = new Memcached;
$memcached->addServers($listOfYourMemcachedSesssionServers);

// Memcached session keys are prefixed with "memc.sess.key." by default
$sessionKeys = preg_grep("@^memc\.sess\.key\.@", $memcached->getAllKeys());
$memcached->deleteMulti($sessionKeys);
Run Code Online (Sandbox Code Playgroud)

当然,您可能只想考虑在正常 HTTP 客户端请求的带外执行此操作,因为清理大型会话存储可能需要一些时间,并且在正常请求生命周期中会产生无意的副作用。