Удаление истекших сеансов - PullRequest
0 голосов
/ 10 января 2019

Это мой первый пост. Я полагаю, что просмотрел некоторые другие форумы, чтобы узнать, был ли уже задан мой вопрос, но я все еще остаюсь, почесывая голову. Я знаю, что есть много сообщений о сессиях с истекшим сроком, но я думаю, с точки зрения конкретного сценария, я думаю.

Пользователь заходит на панель инструментов и переходит на страницу. Как долго он простаивает, затем сборщик мусора делает свое дело и очищает сеанс.

Теперь, если пользователь возвращается к панели инструментов и щелкает, чтобы перейти на другую страницу, я бы хотел, чтобы пользователь вернулся на страницу индекса - эффективно выйдите из системы.

У меня есть страница выхода, на которую пользователь может перейти, когда решит выйти. Я записываю некоторые данные в базу данных, удаляю сеанс и перенаправляю обратно на домашнюю страницу.

Я хотел бы сначала проверить, действительно ли сеанс жив. Если нет, уничтожьте его и перенаправьте на домашнюю страницу. В противном случае удалите его.

Но мой вопрос: если сборщик мусора уже очистил сеанс, нужно ли мне его уничтожать?

<?php 

  session_start( );

  if( !isset( $_SESSION['session'] ) ) { 
     session_destroy( );
     header( "Location: /index.php" );
  }
  else {

     // ... log the data I need in the database ...

     $_SESSION['session'] = array( );

     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( );
     header( "Location: /index.php" );    
  }

?>

Ответы [ 2 ]

0 голосов
/ 10 января 2019

Краткий ответ на ваш вопрос: нет, вам не нужно уничтожать сессию самостоятельно.

session_start() всегда будет запускать или возобновлять сеанс, и этот сеанс всегда будет «живым». Будет ли этот сеанс иметь флаг зарегистрированного пользователя или нет, зависит от вас.

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

Также не рекомендуется звонить session_destroy() с обычного кода .

0 голосов
/ 10 января 2019

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

То, что вы делаете, когда вызываете session_destroy(), это то, что вы инструктируете свой сеанс ADAPTER уничтожать сеанс, а не столько PHP. PHP-мусор постоянно собирает информацию об использовании памяти сеанса, но при этом сохраняет ссылку на постоянство данных сеанса адаптерами.

Так что, да, ты должен позвонить, если только ты не уничтожил его.

...