虽然这个问题有多个重复,但我找不到合适的解决方案。 需要一些帮助。
我在配置文件中使用了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();
答案 0 :(得分:6)
关闭会话的最佳方法是:如果在特定时间间隔后该会话没有响应。然后关闭请看这篇文章,我希望它能解决这个问题。的 “How to change the session timeout in PHP?”强>
答案 1 :(得分:6)
使用保持活力。
登录时:
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
}
答案 2 :(得分:4)
有不同的方法可以做到这一点,但服务器无法检测到浏览器何时关闭,因此破坏它很难。
使用当前时间创建新会话或向当前会话添加时间变量。然后在启动时检查它或执行操作以查看是否必须删除会话。
session_start();
$_SESSION["timeout"] = time();
//if 100 seconds have passed since creating session delete it.
if(time() - $_SESSION["timeout"] > 100){
unset($_SESSION["timeout"];
}
使javascript执行将删除会话的ajax调用,onbeforeunload()
javascript函数在用户离开页面时调用最终操作。出于某种原因,这并不总是有效。
如果您始终希望用户在关闭页面后在启动时看到登录页面,则可以在启动时删除会话。
<? php
session_start();
unset($_SESSION["session"]);
可能还有更多。
答案 3 :(得分:2)
这可能对您有帮助,
session_set_cookie_params(0);
session_start();
您的会话cookie将被销毁...因此,在浏览器打开之前,您的会话将会很好。请查看http://www.php.net//manual/en/function.session-set-cookie-params.php这可能会对您有所帮助。
答案 4 :(得分:1)
您可以使用JavaScript触发ajax请求到服务器,以便在我们关闭浏览选项卡或窗口或浏览器时触发onbeforeunload事件上的会话。
答案 5 :(得分:1)
还有一个&#34; hack&#34;通过使用HTTP Referer(我们认为浏览器窗口已关闭当前引用者的域名和curent页面的域名不匹配):
session_start();
$_SESSION['somevariable'] = 'somevalue';
if(parse_url($_SERVER["HTTP_REFERER"], PHP_URL_HOST) != $_SERVER["SERVER_NAME"]){
session_destroy();
}
这也有一些缺点,但它帮了我几次。
答案 6 :(得分:0)
使用以下代码销毁会话:
<?php
session_start();
unset($_SESSION['sessionvariable']);
header("Location:index.php");
?>
答案 7 :(得分:0)
如果要在每次登录时更改会话ID,请确保在登录过程中使用session_regenerate_id(true)。
<?php
session_start();
session_regenerate_id(true);
?>
答案 8 :(得分:-1)
如果您对此怎么做感到困惑,请参阅 session_destroy()功能手册:
http://php.net/manual/en/function.session-destroy.php
在那里你可以找到session_destroy()的更多功能。