it-roy-ru.com

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

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

$_SESSION['id'] = $id;

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

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

45
user342391

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

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

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

<?php
  if ($_SESSION['timeout'] + 10 * 60 < time()) {
     // session timed out
  } else {
     // session ok
  }
?>
85
Jacco

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

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

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

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

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

Правка: Если вы планируете время сессий из-за соображений безопасности (вместо удобства), используйте принятый ответ, как показано в комментариях ниже, это контролируется клиентом и, следовательно, не является безопасным. Я никогда не думал об этом как о мере безопасности.

43
Vinko Vrsalovic

Просто сначала проверьте, что сеанс еще не создан, а если нет, то создайте его. Здесь я устанавливаю это только на 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';
  }
?>
5
user1473910
<script type="text/javascript">
window.setTimeout("location=('timeout_session.htm');",900000);
</script>

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

2
Byterbit
<?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";
}
?>
1
Uday Hiwarale

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

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

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

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

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

1
Michael Badichi
    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

0
khaled_tn
<?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
Dominic Ceraso