Действительно уничтожить сессию PHP? - PullRequest
18 голосов
/ 04 февраля 2009

Я слышал неоднозначные ответы на эту тему, так какой же верный способ уничтожить сессию PHP?

session_start();
if(isset($_SESSION['foo'])) {
   unset($_SESSION['foo'];
   ...
}
session_destroy();

В самых простых случаях этого будет достаточно, чтобы действительно завершить сеанс между пользователем и сервером?

Ответы [ 4 ]

44 голосов
/ 04 февраля 2009

Чтобы уничтожить сеанс, вы должны предпринять следующие шаги:

  • удалить данные сеанса
  • сделать недействительным идентификатор сессии

Чтобы сделать это, я бы использовал это:

session_start();
// resets the session data for the rest of the runtime
$_SESSION = array();
// sends as Set-Cookie to invalidate the session cookie
if (isset($_COOKIE[session_name()])) { 
    $params = session_get_cookie_params();
    setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], isset($params['httponly']));
}
session_destroy();

И чтобы быть уверенным, что идентификатор сеанса недействителен, вы должны разрешать только те идентификаторы сеанса, которые были инициированы вашим сценарием. Поэтому установите флаг и проверьте, установлен ли он:

session_start();
if (!isset($_SESSION['CREATED'])) {
    // invalidate old session data and ID
    session_regenerate_id(true);
    $_SESSION['CREATED'] = time();
}

Кроме того, вы можете использовать эту временную метку, чтобы периодически менять идентификатор сеанса для сокращения его времени жизни:

if (time() - $_SESSION['CREATED'] > ini_get('session.gc_maxlifetime')) {
    session_regenerate_id(true);
    $_SESSION['CREATED'] = time();
}
1 голос
/ 04 февраля 2009

Руководство по PHP решает этот вопрос.

Вам необходимо прервать сеанс, а также удалить cookie-файл сеанса (если вы используете cookie-файлы).

Смотрите эту страницу (особенно первый пример):

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

0 голосов
/ 02 декабря 2018
$_SESSION = [];
@unset($_COOKIE[session_name()]);
session_destroy();
0 голосов
/ 04 февраля 2009

На одном из созданных мной сайтов, где я использовал сеансы PHP, я никогда не уничтожаю сеанс.

Проблема в том, что вам в значительной степени приходится вызывать session_start() для проверки ваших $_SESSION переменных, и в этот момент, о чудо, вы все равно создали еще один сеанс.

Поэтому на моем сайте я просто позаботился о том, чтобы каждая страница называлась session_start(), а затем просто unset() те части состояния сеанса, которые имеют значение при выходе пользователя из системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...