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 - 关闭浏览器后会话销毁的主要内容,如果未能解决你的问题,请参考以下文章