Удаление переменных сеанса в Safari вызывает ошибки

#php #session #session-variables

#php #сессия #переменные сеанса

Вопрос:

У меня есть три переменные в массиве $ _SESSION: «views», «user_id» и «username». Когда пользователь выходит из системы, «user_id» и «username» удаляются. Это отлично работает во всех браузерах, и в Safari примерно в 75% случаев. Иногда вместо удаления переменных он просто присваивает переменной значение «удалено». Это отключает весь мой сайт, потому что это зависит от того, определена переменная или нет.

Мой код для удаления переменных:

 unset($_SESSION["user_id"]);
unset($_SESSION["username"]);

$_SESSION = array();

session_destroy();
  

И в Safari, var_dump($_SESSION) дает:

 ...
["user_id"] => string(7) "deleted"
["username"] => string(7) "deleted"
...
  

Есть идеи, почему Safari это делает?

Комментарии:

1. Почему вы звоните session_destroy ? Просто используйте unset() , и это должно сработать. Может быть, добавить session_write_close() для хорошей меры

Ответ №1:

Safari не имеет никакого отношения к проблеме. Сеансы управляются на стороне сервера, и все, что связано с Safari (или любым браузером), — это хранение файлов cookie PHPSESSID внутри.

Ваша проблема связана с session_destroy. (выделение мое)

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

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

Ваш unset() вызов должен сделать трюк сам по себе. И вы можете объединить их

 unset($_SESSION["user_id"], $_SESSION["username"]);
  

Попробуйте добавить session_write_close(); и посмотрите, имеет ли это значение.

В противном случае попробуйте удалить файл cookie сеанса

 $params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
    $params["path"], $params["domain"],
    $params["secure"], $params["httponly"]
);
  

Комментарии:

1. Итак, что вы предлагаете ему изменить? Он уже использовал unset() раньше session_destroy() , что еще ему нужно сделать?

2. Я удалил session_destroy() и «$_SESSION = array(), а также добавил строку для удаления файла cookie PHPSESSID. Проблема все еще возникает. Я должен упомянуть, что сразу после удаления этих переменных я перехожу на другую страницу, которая вызывает session_start() и повторно создает переменную $ _SESSION[«Views»] . Я не знаю, имеет ли это какое-либо отношение к этому, но я подумал, может быть, я начинаю сеанс до того, как его успеют удалить, если это возможно.

3. Что странно в этом, так это то, что данные вашего сеанса хранятся на сервере. Поэтому удаление данных из $_SESSION должно быть всем, что вам нужно сделать. Срок действия файла cookie всегда может истечь (отредактированный ответ, чтобы показать, как)

4. Это, и я забыл поместить session_start() в начало файла. Я принял этот ответ. Спасибо!