Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何终止所有php会话?_Php_Session_Login - Fatal编程技术网

如何终止所有php会话?

如何终止所有php会话?,php,session,login,Php,Session,Login,我有一个非常基本的php会话登录脚本。我想强制某个用户注销或强制所有用户注销 如何读取网站上的所有会话,并销毁部分或所有会话?这取决于您的会话存储 如果您使用的是PHP会话存储,那么它们可能位于服务器的临时目录中。删除所选文件将“终止”会话。然而,若您的服务器处于运行状态,那个么该会话文件可能被HTTP进程占用,您将无法删除它。请看下图。名为以“+~”开头的文件都是会话文件。 更好的解决方案是使用数据库会话存储并从中删除所选会话。您可以检查哪个有多个会话。您可以使用查找PHP保存会话文件的路径

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


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

这取决于您的会话存储

如果您使用的是PHP会话存储,那么它们可能位于服务器的临时目录中。删除所选文件将“终止”会话。然而,若您的服务器处于运行状态,那个么该会话文件可能被HTTP进程占用,您将无法删除它。请看下图。名为以“+~”开头的文件都是会话文件。


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

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

您可以通过执行以下操作来强制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_life设置进行比较。它实际上并不处理会话数据。

已更新-2012年8月 这段代码是基于,和另一个写得很好的



效果很好。像NGinx这样的服务器,您可以关闭、清理缓存、刷内存重置、清除日志等,并且通常可以删除临时使用。甚至降低内存限制。

我将创建一个
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);
    }
}
检查是否有登录用户:

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

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

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

$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);

一次清除所有会话需要首先知道用于存储会话的会话,并定位,以便删除所有会话。有关仅删除当前会话的信息,请参阅

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

使用文件保存处理程序 使用memcached保存处理程序

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

< P>我发现这个代码非常有用,它确实对我工作

<?php

$path = session_save_path();

$files = glob($path.'/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

?>

删除所有会话变量

session_unset();
销毁会话

session_destroy();

如果所讨论的路径是global/tmp目录,那么使用这种方法时要非常小心!除了PHP之外,肯定还有其他进程在那里存储临时数据。如果PHP为会话数据预留了自己的目录,那么它应该是相当安全的。显然这不是一个好的做法-但我只是给了他想要的东西!:-p这是OP所问问题的最佳答案,但它不涉及会话未存储在文件系统上的系统(如KARASZI István提到的数据库中)。注意,这将记录服务器上所有帐户的所有用户。如果您在一台服务器上有多个域,并且您以root权限删除会话文件,您将注销所有域上的所有用户。任何内置方法,网站管理员通常使用什么?您是指PHP会话存储?@MarcB session storage意味着特定用户的会话数据将存储在某个位置。默认情况下,PHP会话存储在操作系统的临时目录中。windows中的会话将存储在C:\Users\USER\u NAME\AppData\Local\Temp中。您可以全部覆盖默认机制并将会话存储在数据库中,这将使您能够更好地控制会话。在第二个代码中删除会话只能在本地进行$_会话变量独立于每个用户,我的目标是让所有用户都可以销毁所有会话,是的,但您说过要注销一个或所有用户。ini设置的东西照顾每个人。if()处理特定用户。它在最新版本中不起作用吗?我将WAMPServer2.5与Apache2.4.9和PHP5.5.x一起使用。这甚至删除了存储在TMP目录中的一个SeSS**文件,除了SeSession销毁()删除当前会话的文件。请考虑接受一个提供的答案来奖励那些花了一天时间来帮助您的人。如果有几个答案对你有帮助,你也可以投票给他们。@georgegarchagudashvili你面临什么问题?这只会扼杀当前会话,我使用共享主机,所以我没有太多的权限访问所有内容。如果有危险的话,我想杀死所有当前的授权会话!在删除它们之前,您需要检查它们是否是php会话文件,并且这些文件是否属于您的用户。该保存路径中可能有大量其他文件
$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);
<?php

$path = session_save_path();

$files = glob($path.'/*'); // get all file names
foreach($files as $file){ // iterate files
  if(is_file($file))
    unlink($file); // delete file
}

?>
session_unset();
session_destroy();