Идентификатор сессии PHP в суперглобальной переменной $ _COOKIES остается неизменным после уничтожения

Hy Я новичок в 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);
?>

0

Решение

Увидеть документация:

session_destroy () уничтожает все данные, связанные с текущим сеансом. Он не сбрасывает глобальные переменные, связанные с сеансом, и не сбрасывает cookie сеанса. Чтобы снова использовать переменные сеанса, необходимо вызвать метод session_start ().

… даже если он не установил сеансовый файл cookie, $_COOKIES superglobal включает в себя все куки, которые браузер отправил, когда сделал запрос. Это потребовало бы путешествия во времени для session_destroy запретить браузеру отправлять их в запросе, который в данный момент обрабатывается.


то, что я не понимаю, не имеет значения, сколько раз я запускаю этот код, свойство PHPSESSID в суперглобальном элементе $ _COOKIE всегда одинаково.

Если идентификатор сеанса, отправленный браузером, не соответствует существующему сеансу, при вызове start_sessionзатем он все еще использует тот же идентификатор сеанса для нового сеанса.

session_regenerate_id вынуждает генерацию нового идентификатора, start_session не.

0

Другие решения

Просто используйте session_regenerate_id() после уничтожения сеанса.
https://secure.php.net/manual/en/function.session-regenerate-id.php

Кроме того, уничтожение сеансов не отменяет cookie.

0

хорошо, привет, просто хочу оставить несколько вещей. Ладно, все просто, сеанс уничтожен, не отменяется то, что было установлено в 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);
?>
0

Hy Итак, я выяснил, почему функция setcookie () не уничтожает файл cookie PHPSESSID. Функция session_set_cookie_params () должна быть установлена ​​до начала сеанса, поэтому позже функция setcookie () сможет истечь из файла cookie PHPSESSID.

этот код работает:

<?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();
?>
0
По вопросам рекламы [email protected]