Перейти к содержимому

Как очистить session php

  • автор:

Как правильно уничтожить сессию?

Warning: session_destroy() [function.session-destroy]: Trying to destroy uninitialized session in Z:\home\registr\www\test\exit.php on line 3 Warning: Cannot modify header information — headers already sent by (output started at Z:\home\registr\www\test\exit.php:1) in Z:\home\registr\www\test\exit.php on line 4

Почему так?
Отслеживать
задан 30 авг 2012 в 12:44
145 3 3 золотых знака 9 9 серебряных знаков 20 20 бронзовых знаков
@Анна, Чтобы отформатировать код, выделите его мышью и нажмите на кнопку 101010 редактора.
30 авг 2012 в 12:45

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

На момент выполнения session_destroy у вас сессия не активна и соответственно генерируется WARNING. Перед вызовом session_destroy необходимо добавить вызов session_start .

Если у вас после session_destroy сразу идет редирект то удалять данные из глобальной переменной $_SESSION не обязательно, данные в ней будут доступны только на текущем запросе.

Отслеживать
ответ дан 30 авг 2012 в 13:41
1,126 5 5 серебряных знаков 7 7 бронзовых знаков

сделала так, как вы..получилось вот что Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at Z:\home\registr\www\test\exit.php:1) in Z:\home\registr\www\test\exit.php on line 2

30 авг 2012 в 13:45

Только не забываем exit; после header: location 🙂 Иначе пойдет дальнейшее выполнение скрипта и редирект произойдет после полной отработки. При удалении $_SESSION[‘name’] еще и ошибки будут.

30 авг 2012 в 13:46
так как же построить обработчик закрытия сессии.
30 авг 2012 в 13:53
У вас перед вызовом session_start есть вывод (Z:\home\registr\www\test\exit.php, строка 1).
30 авг 2012 в 14:18
session_start() в начале скриптов находится.. о каком выводе вы говорите?
30 авг 2012 в 14:25

Хедер срабатывает потому что скрипт уже отдал тексты ошибок. Хедеры действуют только до отдачи какого-либо текста клиенту, поэтому после выброса ошибок хэдеры не отправляются (это ваше второе предупреждение). А по первому — просто используйте сначала session_destroy() , а потом как угодно сбивайте $_SESSION 🙂

Отслеживать
ответ дан 30 авг 2012 в 12:50
2,828 14 14 серебряных знаков 18 18 бронзовых знаков

то есть session_destroy(); unset($_SESSION[name]); header(‘Location: index.php’); просто местами поменять? но тоже самое получилось(

30 авг 2012 в 12:53

удаление сессии и по всей видимости у вас перед

header('Location: index.php'); 

имеется какой-то вывод пользователю. echo ?

Отслеживать
ответ дан 30 авг 2012 в 13:10
Александр Молофеев Александр Молофеев
2,346 14 14 серебряных знаков 19 19 бронзовых знаков

session_start(); запускается при авторизации пользователя, на index.php возвращаемся на главую стрнацу.. только я так и не поняла в чем ошибка..

30 авг 2012 в 13:21

session_start(); вызывается не только при авторизации пользователя. она должна вызываться чуть ли не самой первой при каждой загрузке страницы для всех пользователей как авторизованных так и нет. и видимо вам будет много проще сделать loguot на аяксах: выйти или без аякса вовсе: выйти а в loguot.php: session_start(); session_destroy(); $_SESSION=array(); // unset($_SESSION[key]); etc.. header(‘location: /index.php’);

session_unset

Функция session_unset() удаляет все зарегистрированные переменные текущей сессии.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Список изменений

Версия Описание
7.2.0 Теперь возвращаемый тип этой функции bool . Раньше был тип void .

Примечания

Замечание:

При использовании $_SESSION для удаления переменных сессии, то используйте функцию unset() . Например, unset($_SESSION[‘varname’]); .

Предостережение

НЕ удаляйте весь массив $_SESSION с помощью unset($_SESSION) , так как это приведёт к невозможности регистрации новых переменных через суперглобальный массив $_SESSION

Замечание:

Использование функции session_unset() идентично $_SESSION = [] .

Предостережение

Функция работает только в том случае, если сессия активна. Она не очистит массив $_SESSION , если сессия ещё не запущена или уже уничтожена. Используйте $_SESSION = [] для удаления всех переменных сессии, даже если сессия не активна.

User Contributed Notes 4 notes

12 years ago

I was having a problem clearing all session variables, deleting the session, and creating a new session without leaving old session stuff behind in all browsers. The below code is perfect for a logout script to totally delete everything and start new. It even works in Chrome which seems to not work as other browsers when trying do logout and start a new session.

session_start ();
session_unset ();
session_destroy ();
session_write_close ();
setcookie ( session_name (), » , 0 , ‘/’ );
session_regenerate_id ( true );
?>

8 years ago

The difference between both session_unset and session_destroy is as follows:

session_unset just clears out the session for usage. The session is still on the users computer. Note that by using session_unset, the variable still exists. session_unset just remove all session variables. it does not destroy the session. so the session would still be active.

Using session_unset in tandem with session_destroy however, is a much more effective means of actually clearing out data. As stated in the example above, this works very well, cross browser. session_destroy is destroy the session. session_destroy() to kill all session information. This is the more secure function to use.

18 years ago

note to Jason: I don’t know the exact mechanics of it (since I’m quite new to sessions) but I think you need to use session_unset() BEFORE you can use session_destroy() at all. I thought that session_unset() was for scripted variables, and session_destroy() just for anything saved on your side regarding the session.

18 years ago

The difference between both session_unset and session_destroy is as follows:

session_unset just clears out the sesison for usage. The session is still on the users computer. Note that by using session_unset, the variable still exists.

Using session_unset in tandem with session_destroy however, is a much more effective means of actually clearing out data. As stated in the example above, this works very well, cross browser:

I noticed that in firefox, one could simply use sesison_unset and the session would be cleared. When trying this on IE, I was horrified to find out that the data was still there, so I had to use session destroy.

  • Функции для работы с сессиями
    • session_​abort
    • session_​cache_​expire
    • session_​cache_​limiter
    • session_​commit
    • session_​create_​id
    • session_​decode
    • session_​destroy
    • session_​encode
    • session_​gc
    • session_​get_​cookie_​params
    • session_​id
    • session_​module_​name
    • session_​name
    • session_​regenerate_​id
    • session_​register_​shutdown
    • session_​reset
    • session_​save_​path
    • session_​set_​cookie_​params
    • session_​set_​save_​handler
    • session_​start
    • session_​status
    • session_​unset
    • session_​write_​close
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    session_destroy

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

    Замечание: Нет необходимости вызывать session_destroy() в обычном коде. Очищайте массив $_SESSION вместо удаления данных сессии.

    Чтобы полностью удалить сессию, также необходимо удалить и её идентификатор. Если для передачи идентификатора сессии используются cookie (поведение по умолчанию), то сессионные cookie также должны быть удалены. Для этого можно использовать setcookie() .

    При включённой опции session.use_strict_mode, вам не нужно удалять устаревшие cookie идентификатора сессии. В этом нет необходимости, потому что модуль сессии не примет cookie идентификатора сессии, если с этим идентификатором сессии нет связанных данных, и модуль сессии установит новый cookie идентификатора сессии. Рекомендуется включать опцию session.use_strict_mode для всех сайтов.

    Внимание

    Немедленное удаление сессии может привести к нежелательным последствиям. При наличии конкурирующих запросов, другие соединения могут столкнуться с внезапной потерей данных сессии, например, это могут быть запросы от JavaScript и/или запросы из ссылок URL.

    Даже если текущий модуль сессии не поддерживает пустые cookie идентификатора сессии, немедленное удаление сессии может привести к пустым cookie идентификатора сессии из-за состояния гонки на стороне клиента (браузера). Это приведёт к тому, что клиент создаст множество идентификаторов сессии без необходимости.

    Чтобы этого избежать, необходимо установить в $_SESSION временную метку удаления и убрать доступ позже. Или удостовериться, что ваше приложение не имеет конкурирующих запросов. Это также относится к session_regenerate_id() .

    Список параметров

    У этой функции нет параметров.

    Возвращаемые значения

    Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

    Примеры

    Пример #1 Уничтожение сессии с помощью $_SESSION

    // Инициализируем сессию.
    // Если вы используете session_name(«something»), не забудьте добавить это перед session_start()!
    session_start ();

    // Удаляем все переменные сессии.
    $_SESSION = array();

    // Если требуется уничтожить сессию, также необходимо удалить сессионные cookie.
    // Замечание: Это уничтожит сессию, а не только данные сессии!
    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 ();
    ?>

    Смотрите также

    • session.use_strict_mode
    • session_reset() — Реинициализирует сессию оригинальными значениями
    • session_regenerate_id() — Генерирует и обновляет идентификатор текущей сессии
    • unset() — Удаляет переменную
    • setcookie() — Отправляет cookie

    User Contributed Notes 4 notes

    11 years ago

    If you want to change the session id on each log in, make sure to use session_regenerate_id(true) during the log in process.

    session_start ();
    session_regenerate_id ( true );
    ?>

    [Edited by moderator (googleguy at php dot net)]

    9 years ago

    It took me a while to figure out how to destroy a particular session in php. Note I’m not sure if solution provided below is perfect but it seems work for me. Please feel free to post any easier way to destroy a particular session. Because it’s quite useful for functionality of force an user offline.

    1. If you’re using db or memcached to manage session, you can always delete that session entry directly from db or memcached.

    2. Using generic php session methods to delete a particular session(by session id).

    $session_id_to_destroy = ‘nill2if998vhplq9f3pj08vjb1’ ;
    // 1. commit session if it’s started.
    if ( session_id ()) session_commit ();
    >

    // 2. store current session id
    session_start ();
    $current_session_id = session_id ();
    session_commit ();

    // 3. hijack then destroy session specified.
    session_id ( $session_id_to_destroy );
    session_start ();
    session_destroy ();
    session_commit ();

    // 4. restore current session id. If don’t restore it, your current session will refer to the session you just destroyed!
    session_id ( $current_session_id );
    session_start ();
    session_commit ();

    6 years ago

    I’m using PHP 7.1 and received the following warning when implementing Example #1, above:

    PHP message: PHP Warning: session_destroy(): Trying to destroy uninitialized session in.

    What I discovered is that clearing $_SESSION and removing the cookie destroys the session, hence the warning. To avoid the warning while still keeping the value of using session_destroy(), do this after everything else:

    if (session_status() == PHP_SESSION_ACTIVE)

    3 years ago

    All of a sudden neither session_destroy() nor $_SESSION=[] were sufficient to log out. I found the next to work:
    setcookie ( session_name (), session_id (), 1 ); // to expire the session
    $_SESSION = [];
    ?>

    • Функции для работы с сессиями
      • session_​abort
      • session_​cache_​expire
      • session_​cache_​limiter
      • session_​commit
      • session_​create_​id
      • session_​decode
      • session_​destroy
      • session_​encode
      • session_​gc
      • session_​get_​cookie_​params
      • session_​id
      • session_​module_​name
      • session_​name
      • session_​regenerate_​id
      • session_​register_​shutdown
      • session_​reset
      • session_​save_​path
      • session_​set_​cookie_​params
      • session_​set_​save_​handler
      • session_​start
      • session_​status
      • session_​unset
      • session_​write_​close
      • Copyright © 2001-2024 The PHP Group
      • My PHP.net
      • Contact
      • Other PHP.net sites
      • Privacy policy

      PHP — Завершение сессии

      Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы.

      Для того, чтобы завершить сессию нам нужно:

      1. 1. Очистить массив $_SESSION.
      2. 2. Удалить временное хранилище на сервере.
      3. 3. Удалить сессионный cookie.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12

      //1. очищаем массив $_SESSION
      $_SESSION = array();

      // или можно сделать это с помощью функции
      session_unset ();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *