2009-02-03 4 views
18

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

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

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

+0

Посмотрите по адресу://stackoverflow.com/questions/10648565/destroying-php-session/10662060#10662060 – Brett

ответ

40

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

  • удалить данные сессии
  • сессию недействительной ID

Для этого I «D использовать это:

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(); 
} 
+2

Отличные отзывы, спасибо Gumbo. –

+2

Я знаю, что это старо, но вы ответили как 3 вопроса в одном ответе за меня. Спасибо! – jefffan24

+0

В вашем первом примере в строке 5 вместо '$ _COOKIES' он должен быть' $ _COOKIE', иначе вы можете задаться вопросом, почему он никогда не уничтожает cookie сеанса с 'isset ($ _ COOKIES [session_name()])' никогда не будет оценивать к истине. –

0

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

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

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

+0

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

1

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

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

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

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

Смежные вопросы