@newaitix

Почему сессия не уничтожается?

Есть код он инклюдится на каждую страницу а так же в файл auth.php
ini_set('session.cookie_secure',true);
ini_set('session.cookie_httponly',true);
ini_set('session.gc_maxlifetime',604800);
ini_set('session.cookie_lifetime',604800);
ini_set('session.save_path',__DIR__.'/_sessions/');
session_name('test');
session_start();


Выход из сессии осуществляется GET запросом в файл auth.php.
session_destroy();

Проблема в том что при первом запросе к файлу auth.php сессия не уничтожается. Она уничтожается только если сделать запрос к файлу auth.php, затем перезагрузить страницу, затем снова сделать запрос к файлу auth.php.
Перебирая код я определил, что проблема в строке
ini_set('session.cookie_httponly',true);
Если я ее закоментирую, то сессия будет уничтожаться при первом же запросе.
Почему так происходит?
Возможно если я устанавливаю cookie_httponly, то не достаточно просто сделать session_destroy, а нужно что то еще?
  • Вопрос задан
  • 354 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Kabz1tov
Попробуй создать файл logout.php и обращаться к нему
<?php
session_start();
session_unset();
session_destroy();
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Давайте вместе почитаем документацию и поучимся понимать что пишут умные дяди и тети:

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

Замечание: Нет необходимости вызывать session_destroy() в обычном коде. Очищайте массив $_SESSION вместо удаления данных сессии.
Очень важное замечание, как раз связанное с вашей возмущенной репликой о том что "ну вот так же работает!111!". При большом разнообразии настроек и конфигураций серверов, сессия может вести себя по разному, что с одной стороны дает гибкость поведения если знать как и зачем вы что-то делаете, с другой стороны может вызвать проблемы, как в вашем случае, когда вы не очень понимаете зачем какие настройки и как обойти возникшие сайдэффекты. По этому самым верным решением является удаление данных из сессии.

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

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

Войдите, чтобы написать ответ

Похожие вопросы