Тайм-аут сеанса PHP - PullRequest
       43

Тайм-аут сеанса PHP

46 голосов
/ 18 июня 2010

Я создаю сеанс, когда пользователь входит в систему следующим образом:

$_SESSION['id'] = $id;

Как я могу указать время ожидания в этом сеансе в X минут, а затем заставить его выполнить функцию или перенаправить страницу, как толькодостиг X минут ??

РЕДАКТИРОВАТЬ: я забыл упомянуть, что мне нужно время ожидания сеанса из-за бездействия.

Ответы [ 8 ]

85 голосов
/ 18 июня 2010

сначала сохранить последний раз, когда пользователь сделал запрос

<?php
  $_SESSION['timeout'] = time();
?>

в последующем запросе, проверьте, как давно они сделали предыдущий запрос (в этом примере 10 минут)

<?php
  if ($_SESSION['timeout'] + 10 * 60 < time()) {
     // session timed out
  } else {
     // session ok
  }
?>
43 голосов
/ 18 июня 2010

Когда сеанс истекает, данные больше не присутствуют, поэтому что-то вроде

if (!isset($_SESSION['id'])) {
    header("Location: destination.php");
    exit;
}

будет перенаправлять, когда сеанс больше не активен.

Вы можете установить, как долго сессионный cookie будет работать, используя session.cookie_lifetime

ini_set("session.cookie_lifetime","3600"); //an hour

РЕДАКТИРОВАТЬ: Если вы планируете отсрочивать сеансы из-за соображений безопасности (вместо удобства), используйте принятый ответ, как показано в комментариях ниже, это контролируется клиентом и поэтому не является безопасным. Я никогда не думал об этом как о мере безопасности.

5 голосов
/ 27 июня 2012

Просто сначала проверьте, что сеанс еще не создан, а если нет, то создайте его.Здесь я устанавливаю его только на 1 минуту.

<?php 
   if(!isset($_SESSION["timeout"])){
     $_SESSION['timeout'] = time();
   };
   $st = $_SESSION['timeout'] + 60; //session time is 1 minute
?>

<?php 
  if(time() < $st){
    echo 'Session will last 1 minute';
  }
?>
2 голосов
/ 29 мая 2013
<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

В шапке каждая страница работала у меня во время тестирования сайта (сайт еще не в разработке)HTML-страница, на которую она падает, завершает сеанс и просто информирует пользователя о необходимости снова войти в систему.Это кажется более простым способом, чем играть с логикой PHP.Я хотел бы прокомментировать эту идею.Какие-нибудь ловушки, которые я там не видел?

1 голос
/ 01 марта 2016

Битбитное решение проблематично, потому что:

  1. истечение срока действия клиентского cookie-файла на стороне сервера является проблемой безопасности.
  2. если тайм-аут истечения, установленный на стороне сервера, меньше, чем тайм-аут, установленный на стороне клиента, страница не будет отражать фактическое состояние файла cookie.
  3. даже если ради удобства на этапе разработки это проблема, потому что она не будет отражать правильное поведение (по времени) на этапе выпуска.

для файлов cookie, установка срока действия с помощью session.cookie_lifetime - это правильное решение с точки зрения дизайна и безопасности! для окончания сессии вы можете использовать session.gc_maxlifetime.

истечение срока действия файлов cookie путем вызова session_destroy может привести к непредсказуемым результатам, поскольку они, возможно, уже истекли.

Внесение изменений в php.ini также является допустимым решением, но оно делает глобальный срок действия для всего домена, который может не соответствовать вашему желанию - некоторые страницы могут оставить некоторые файлы cookie больше других.

1 голос
/ 30 сентября 2013
<?php 
session_start();

if (time()<$_SESSION['time']+10){
$_SESSION['time'] = time();
echo "welcome old user";
}

else{
session_destroy();
session_start();
$_SESSION['time'] = time();
echo "welcome new user";
}
?>
0 голосов
/ 22 апреля 2015
<?php
session_start();
if($_SESSION['login'] != 'ok')
    header('location: /dashboard.php?login=0');

if(isset($_SESSION['last-activity']) && time() - $_SESSION['last-activity'] > 600) {
    // session inactive more than 10 min
    header('location: /logout.php?timeout=1');
}

$_SESSION['last-activity'] = time(); // update last activity time stamp

if(time() - $_SESSION['created'] > 600) {
    // session started more than 10 min ago
    session_regenerate_id(true); // change session id and invalidate old session
    $_SESSION['created'] = time(); // update creation time
}
?>
0 голосов
/ 09 февраля 2012
    session_cache_expire( 20 );
    session_start(); // NEVER FORGET TO START THE SESSION!!!
    $inactive = 1200; //20 minutes *60
    if(isset($_SESSION['start']) ) {
$session_life = time() - $_SESSION['start'];
if($session_life > $inactive){
    header("Location: user_logout.php");
}
    }
    $_SESSION['start'] = time();

    if($_SESSION['valid_user'] != true){
    header('Location: ../....php');
    }else{  

источник: http://www.daniweb.com/web-development/php/threads/124500

...