@fattan
программист

Как правильно реализовать logout на php?

Есть самописная система. Многие годы всё работало как часы. Работало так долго, что мы уже забыли как оно там всё внутри работает, и души не чаяли. А тут вдруг (причина неизвестна) - то ли версию php обновили, то ли что-то переписали в системе, и перестал отрабатывать.... ВЫХОД.
В Файерфокс приходится 3 раза жать на выход, чтобы юзер разлогинился. В Хроме вообще не разлогинивается, даже если закрыть все вкладки и перезагрузить браузер.
Код логаута:

function close_user_session(){

    if ( session_id() ) {
        $q = "DELETE FROM sessions WHERE id_session = '".session_id()."'";
        $del = mysql_query($q);
    }

        setcookie(session_name(), session_id(), time()-60*60*60*24);
		
        // и уничтожаем сессию
        session_destroy();
}


Также пробовали варианты (изменений нет):

function close_user_session(){

        // Если есть активная сессия, удаляем куки сессии,
        setcookie(session_name(), session_id(), time()-60*60*60*24);
        // и уничтожаем сессию
        session_unset();
        session_destroy(); 
}


или украденный у modx evo

setcookie(session_name(), '', 0);
session_destroy();


Пожалуйста, подскажите в какую сторону копать, чтобы решить проблему.

По отладке происходит сейчас вот что:

print_r( $_COOKIE);
/* $_COOKIE
 Array
(
    [PHPSESSID] => oec8e0puoh0vvb4j8pkkmiets4
)
*/

/* $_SESSION
Array
(
    [authorized] => 1
    [user_id] => 143
)
*/
    print_r( $_SESSION);


if (isset($_COOKIE[session_name()])) {
    setcookie(session_name(), '', 0);
}
//// now destroy the session
session_destroy();

    print_r( $_COOKIE);
/* $_COOKIE
 Array
(
    [PHPSESSID] => oec8e0puoh0vvb4j8pkkmiets4
)
*/

/* $_SESSION
Array
(
    [authorized] => 1
    [user_id] => 143
)
*/
    print_r( $_SESSION);


Будто дестроя и не происходит

Код:
setcookie(session_name(), session_id(), time()-60*60*60*24);


даёт тот же результат что и листингом выше.

Сама функция дестроя выводит:

WARNING - session_destroy(): Session object destruction failed
Строка 187 в файле blablabla\functions.php


Кстати, всё еще зависит от браузера:
Махтон - всё ок отрабатывает. Никаких косяков.
Файерфокс - логаут происходит после 3х-4х нажатий на "выход".
Гуглохром - даже если закрыть вкладки, закрыть браузер, всё равно сессия не рвётся. Вообще. Никогда. Только чистка истории помогает.
  • Вопрос задан
  • 4463 просмотра
Решения вопроса 1
@fattan Автор вопроса
программист
Переместил session_destroy(); как можно ближе к session_start(). Проблема решилась.

session_start();

if (isset($_GET['logout'])) {
    session_destroy();
    header('location: /bla/bla/bla/index.php?module=auth&action=start' );

}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Pinsky
@Pinsky
Кофеиноникотиновая смесь в backend-код
через xdebug не пробовали проходить и смотреть где что отваливается?
Ответ написан
za4me
@za4me
Человек
Посмотреть в git что переписали.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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