如何杀死/所有php会话?

时间:2011-03-04 12:33:46

标签: php session login

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

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

9 个答案:

答案 0 :(得分:14)

您可以尝试通过执行

强制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设置进行比较。它实际上并不处理会话数据。

答案 1 :(得分:6)

更新 - 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这样的服务器你可以关闭,清理缓存,刷卡内存重置,清除日志等,并通常删除临时使用。甚至放弃了记忆的极限。

答案 2 :(得分:5)

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

答案 3 :(得分:3)

这取决于您的会话存储空间。

如果您正在使用PHP会话存储,那么它们可能位于服务器的临时目录中。删除所选文件将“终止”会话。

更好的解决方案是使用数据库会话存储并从那里删除选定的会话。您可以查看包含多个HTTP_Session2containers

答案 4 :(得分:2)

我将创建一个包含令牌的txt文件,该令牌与生成的登录会话具有相同的值,作为每次用户登录时的比较:

if($_SERVER['REQUEST_METHOD'] == 'POST') {
    $token = sha1(uniqid(mt_rand(), true));
    if($everything_is_valid) {
        // Set login session
        $_SESSION[$_POST['username']] = $token;
        // Create token file
        file_put_contents('log/token.' . $_POST['username'] . '.txt', $token);
        // Just to be safe
        chmod('log/token.' . $_POST['username'] . '.txt', 0600);
    }
}

检查登录用户:

if(isset($_SESSION['charlie']) && file_exists('log/token.charlie.txt') && $_SESSION['charlie'] == file_get_contents('log/token.charlie.txt')) {
    echo 'You are logged in.';
}

因此,如果要强制注销此charlie用户,只需删除令牌文件:

// Force logout the `charlie` user
unlink('log/token.charlie.txt');

答案 5 :(得分:2)

立即清除所有会话需要首先了解哪个session.save_handler用于存储会话并找到session.save_path以删除所有会话。要仅删除当前会话,请参阅the documentation for session_destroy()

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

使用文件保存处理程序

foreach(glob(ini_get("session.save_path") . "/*") as $sessionFile) {
    unlink($sessionFile);
}

使用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);

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

答案 6 :(得分:2)

我发现这段代码非常有用,而且它真的对我有用

@login_required
def login_redirect(request):
    return redirect('profile:profile_view', username=request.user.username)

答案 7 :(得分:0)

陶菲克的答案是我能找到的最好的答案 但是,您可以进一步修改它 在验证用户身份并创建会话变量后,添加以下行:

$token = "/sess_" . session_id();
file_put_contents('log/' . $_SESSION['id'] . '.txt', $token);

如果您需要强制用户在cronjob期间或通过管理员请求注销:

$path = session_save_path();
$file = file_get_contents('log/xxx.txt'); // xxx is user's id
$url = $path.$file;
unlink($url);

答案 8 :(得分:0)

删除所有会话变量

This can be helpful: https://github.com/react-native-image-picker/react-native-image-picker/issues/1259

In manifest
 android:requestLegacyExternalStorage="true"
  
 <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="true"
      android:theme="@style/AppTheme"
      android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true"> 


  build.gradle

 // camera    
    compileSdkVersion = 29 

破坏会话

session_unset();