session_destroy()
само по себе не удалит cookie-файл на стороне клиента, поэтому в следующий раз, когда пользователь посетит, у него все равно будет установлен тот же идентификатор сеанса (но его информация о сеансе на стороне сервера будет уничтожена).
Из документов (выделено мое):
session_destroy () уничтожает все данные, связанные с текущим
сессия. Он не сбрасывает ни одну из глобальных переменных, связанных с
сеанс или сброс файла cookie сеанса. ... чтобы убить
сеанс в целом, как выход пользователя из системы, идентификатор сеанса также должен
быть неустановленным . Если cookie используется для распространения идентификатора сеанса (по умолчанию
поведение), то файл cookie сеанса должен быть удален.
Вы можете использовать session_regenerate_id(true)
для генерации нового идентификатора сеанса и удаления старого. Обратите внимание, что это сохранит всю информацию в $_SESSION
как часть нового идентификатора сеанса, поэтому вам все равно нужно будет использовать session_destroy
, если вы хотите очистить информацию о сеансе и начать заново.
например.
<?php
session_start();
$_SESSION['blah'] = true;
var_dump(session_id()); // q4ufhl29bg63jbhr8nsjp665b1
var_dump($_SESSION); // blah = true
session_unset();
session_destroy();
setcookie("PHPSESSID", "", 1); // See note below
session_start();
session_regenerate_id(true);
var_dump(session_id()); // gigtleqddo84l8cm15qe4il3q3
var_dump($_SESSION); // (empty)
?>
и в заголовках будет показан идентификатор сеанса, изменяющийся на стороне клиента:
Заголовок запроса
Cookie: PHPSESSID = q4ufhl29bg63jbhr8nsjp665b1
заголовок ответа
Set-Cookie: PHPSESSID = удален; expires = понедельник, 27 декабря 2010 г. 16:47:57 GMT
PHPSESSID = gigtleqddo84l8cm15qe4il3q3; путь = /
(Вы можете обойтись без вызова setcookie()
здесь, так как вы все равно создаете новый сеанс, поэтому cookie будет перезаписываться новым идентификатором, но хорошей практикой является явное уничтожение старого cookie ).