PHP - 关闭浏览器后会话销毁

Posted

技术标签:

【中文标题】PHP - 关闭浏览器后会话销毁【英文标题】:PHP - Session destroy after closing browser 【发布时间】:2014-08-15 15:00:48 【问题描述】:

虽然这个问题有多个重复项,但我找不到适合我的解决方案。 需要一些帮助。

我在我的配置文件中使用了ini_set('session.cookie_lifetime', 0);

但这并没有帮助我在浏览器关闭时销毁会话。

应用电流:

1) 在认证页面如果用户有效,使用session_regenerate_id(true);生成新的会话标识符

2) 控制权转到welcome.php,我使用session_start(); 开始新会话

3) 在注销页面代码是

      $_SESSION = array();
      if (ini_get("session.use_cookies")) 
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
        $params["path"], $params["domain"],
        $params["secure"], $params["httponly"]
      );
     
    // Finally, destroy the session.
    session_destroy();

【问题讨论】:

请详细说明。 “销毁会话”实际上是什么意思? 如果用户关闭浏览器,我想关闭现有会话。如果用户重新打开浏览器,我想再次向他发送登录页面。 “关闭现有会话”是什么意思? 关闭浏览器绝不是破坏 cookie 会话的最佳方式,因为网络服务器永远不知道浏览器何时关闭。浏览器不会向服务器发送任何它正在关闭的通知,因此服务器无法发送删除 cookie 的命令,因为浏览器已关闭。 提示,登录时取消选中记住我选项。;p 【参考方案1】:

这可能对你有帮助,

session_set_cookie_params(0);
session_start();

您的会话 cookie 将被销毁...因此您的会话将保持良好状态,直到浏览器打开。请查看http://www.php.net//manual/en/function.session-set-cookie-params.php这可能会对您有所帮助。

【讨论】:

这应该是最佳答案【参考方案2】:

使用保活。

登录时:

session_start();
$_SESSION['last_action'] = time();

每隔几秒(例如 20 秒)调用一次 ajax:

windows.setInterval(keepAliveCall, 20000);

服务器端keepalive.php:

session_start();
$_SESSION['last_action'] = time();

关于其他所有操作:

session_start();
if ($_SESSION['last_action'] < time() - 30 /* be a little tolerant here */) 
  // destroy the session and quit

【讨论】:

这是小人的解决方案。为什么?因为如果您更改会话,则需要在脚本末尾重写。如果您有一个大型网站,那么仅用于自动注销用户就需要大量 I/O。 @Umigo:您不需要将文件用作会话存储。 PHP 提供了例如 Memcache 作为替代方案。 关于如何检查用户是否在线或离线(y)的最佳和最简单的答案 @colburton 即使在使用 Memcache 时;它仍然是 I/O,如果有足够的用户,仍然会引起问题。此外,它可能会导致更多 also 需要由网络服务器处理的请求,这 also 会消耗资源(无论您获得多少资源) ,它不会为零)。我宁愿重新评估为什么要如此匆忙地销毁会话,而不是损害扩展或在机器上造成“不必要”负载的可能性。【参考方案3】:

关闭会话的最佳方法是:如果在特定时间间隔后该会话没有响应。然后关闭。请看这篇文章,我希望它能解决这个问题。 "How to change the session timeout in PHP?"

【讨论】:

【参考方案4】:

有不同的方法可以做到这一点,但服务器无法检测到浏览器何时关闭,因此很难销毁它。

会话超时。

要么使用当前时间创建新会话,要么将时间变量添加到当前会话。然后在启动或执行操作时检查它是否必须删除会话。

session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100) 
    unset($_SESSION["timeout"];

ajax

使 javascript 执行将删除会话的 ajax 调用,使用 onbeforeunload() 一个 javascript 函数在用户离开页面时调用最终操作。出于某种原因,这并不总是有效。

在启动时将其删除。

如果您总是希望用户在页面关闭后在启动时看到登录页面,您可以在启动时删除会话。

<? php
session_start();
unset($_SESSION["session"]);

可能还有更多。

【讨论】:

【参考方案5】:

使用HTTP Referer还有一个“hack”(我们假设浏览器窗口关闭了当前referer的域名和当前页面的域名不匹配):

session_start();
$_SESSION['somevariable'] = 'somevalue';

if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST) != $_SERVER["SERVER_NAME"])
    session_destroy();

这也有一些缺点,但它帮助了我几次。

【讨论】:

【参考方案6】:

您可以使用 JavaScript 通过触发对服务器的 ajax 请求来销毁在我们关闭浏览选项卡或窗口或浏览器时触发的 onbeforeunload 事件上的会话。

【讨论】:

【参考方案7】:

使用以下代码销毁会话:

 <?php
    session_start();
    unset($_SESSION['sessionvariable']);
    header("Location:index.php");
    ?>

【讨论】:

如果用户点击注销就可以了。我认为 Shri 想要确保会话在用户关闭浏览器时被销毁。 会话在关闭浏览器时自动销毁 先阅读问题【参考方案8】:

如果您想在每次登录时更改会话 id,请确保在登录过程中使用 session_regenerate_id(true)。

<?php
session_start();
session_regenerate_id(true);
?> 

【讨论】:

【参考方案9】:

如果你不知道该怎么做,只需参考 session_destroy() 函数的手册:

http://php.net/manual/en/function.session-destroy.php

在那里您可以找到 session_destroy() 的更多功能。

【讨论】:

以上是关于PHP - 关闭浏览器后会话销毁的主要内容,如果未能解决你的问题,请参考以下文章

当用户关闭浏览器而不单击注销时销毁或取消设置会话[重复]

PHP中,怎么才能关闭浏览器后自动销毁session?

如何让 PHP 会话在浏览器关闭或一段时间后过期

Java Web 浏览器关闭后Session就会被销毁吗?

浏览器关闭后,Session会话结束了么?

#yyds干货盘点#会话管理