您好,我是php的新手,请根据此处的php文档尝试破坏会话:http://php.net/manual/en/function.session-destroy.php 所以我在用这段代码:
<?php
session_start();
echo 'cokkies before delete session';
var_dump($_COOKIE);
var_dump($_SESSION);
echo '-------------- <br>';
$_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"]
);
}
session_destroy();
echo 'cokkies after delete session';
var_dump($_COOKIE);
var_dump($_SESSION);
?>
那么,服务器上的会话ID是否会完全销毁,而cookie中的ID仍然有效?总体而言,为什么会这样解决? 感谢您的回答
答案 0 :(得分:0)
请参见documentation:
session_destroy()销毁与当前会话关联的所有数据。它不会取消设置与该会话关联的任何全局变量,也不会取消设置会话cookie。要再次使用会话变量,必须调用session_start()。
…即使已取消设置会话cookie,$_COOKIES
超全局也包括浏览器发出请求时发送的所有cookie。 session_destroy
需要花费时间,以防止浏览器在当前正在处理的请求中发送它们。
我不理解的是,无论运行此代码多少次,$ _ COOKIE超全局变量中的PHPSESSID属性始终完全相同。
如果浏览器发送的会话ID与现有会话不匹配,则在调用start_session
时,新会话仍将使用相同的会话ID。
session_regenerate_id
强制生成新ID,start_session
则不生成。
答案 1 :(得分:0)
销毁会话后只需使用session_regenerate_id()
。
https://secure.php.net/manual/en/function.session-regenerate-id.php
销毁会话也不会取消设置cookie。
答案 2 :(得分:0)
好吧,我只想留下一些东西。好的,很简单,会话销毁并不会取消设置Cookie的设置。众所周知,在有效期结束之前,cookie一直可用。即使重新生成了会话,它仍然会更新cookie。如果您刷新该页面一百万次,我建议您将它控制在其他位置,您仍然会获得与输出相同的结果。这更像是在做同样的事情,并期待更好的结果。如果您愿意,我可以给您写一个片段。希望对您有帮助
===我的发现==
<?php
session_start();
define('NEWLINE', '<br><br>');
echo "cookie before delete session. <br>";
var_dump($_COOKIE);
echo NEWLINE;
echo "session Here <br>";
var_dump($_SESSION);
echo NEWLINE;
echo "------------------------<br>";
$_SESSION = array();
if (ini_get('session.use_cookies'))
{
$params = session_get_cookie_params();
echo "cookie already has PHPSESSID even before you set it here ..<br>";
// The solution i could arrive with
// without this PHPSESSID wouldn't give you a new id.
session_regenerate_id();
}
// now destroy
session_destroy();
echo "Cookie here would not change. Just refresh the page and try commenting session_regenerate_id() to see the difference. <br>";
var_dump($_COOKIE);
echo "Session when destroyed. <br>";
var_dump($_SESSION);
?>
答案 3 :(得分:0)
嘿,所以我发现了为什么setcookie()函数没有破坏PHPSESSID cookie。在开始会话之前需要设置session_set_cookie_params()函数,因此稍后setcookie()函数将能够使PHPSESSID cookie失效。
此代码有效:
<?php
$lifetIme = 60 * 60 * 24 * 360;
$path = '/';
$domain = 'yourdomain';
$secure = isset($_SERVER["HTTPS"]);
$httponly = true;
session_set_cookie_params ($lifetIme, $path, $domain, $secure, $httponly);
session_start();
$expire = strtotime('-1 year');
setcookie('PHPSESSID', '', $expire, $path, $domain, $secure, $httponly);
session_destroy();
?>