Я создаю сеанс, когда пользователь входит в систему так:
$_SESSION['id'] = $id;
Как я могу указать тайм-аут на этом сеансе в течение X минут, а затем выполнить функцию или перенаправить страницу после того, как она достигнет X минут?
EDIT: Я забыл упомянуть, что мне нужен сеанс таймаута из-за бездействия.
сначала сохраните последний раз, когда пользователь сделал запрос
<?php $_SESSION['timeout'] = time(); ?>
в последующем запросе, проверьте, как давно они сделали свой предыдущий запрос (10 минут в этом примере)
<?php if ($_SESSION['timeout'] + 10 * 60 < time()) { // session timed out } else { // session ok } ?>
Когда сеанс истекает, данные больше не присутствуют, поэтому что-то вроде
if (!isset($_SESSION['id'])) { header("Location: destination.php"); exit; }
будет перенаправляться всякий раз, когда сеанс больше не активен.
Вы можете установить, сколько времени работает cookie сеанса, используя session.cookie_lifetime
ini_set("session.cookie_lifetime","3600"); //an hour
EDIT: Если вы проводите сеансы синхронизации из-за проблем с безопасностью (вместо удобства), используйте принятый ответ, как видно из приведенных ниже комментариев, это контролируется клиентом и, следовательно, не защищается. Я никогда не думал об этом как о мерах безопасности.
Просто проверьте сначала, что сеанс еще не создан, и если его не создать. Здесь я устанавливаю его только на 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'; } ?>
-<?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'; } ?>
<script type="text/javascript"> window.setTimeout("location=('timeout_session.htm');",900000); </script>
В заголовке каждой страницы работает для меня во время тестирования сайта (сайт еще не выпущен). На странице HTML она заканчивается сеансом и просто информирует пользователя о необходимости повторного входа в систему. Это кажется более простым способом, чем игра с логикой PHP. Мне понравились бы некоторые комментарии к этой идее. Любые ловушки, которые я не видел в нем?
<?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"; } ?>
Решение Byterbit проблематично, потому что:
для файлов cookie установка истечения срока действия через session.cookie_lifetime – правильное решение, разумное и безопасное! для завершения сеанса вы можете использовать session.gc_maxlifetime.
истечение файлов cookie путем вызова session_destroy может привести к непредсказуемым результатам, поскольку они, возможно, уже истекли.
внесение изменений в php.ini также является допустимым решением, но это делает глобальный срок действия для всего домена, который может быть не таким, каким вы действительно хотите – некоторые страницы могут захотеть сохранить некоторые файлы cookie больше, чем другие.
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
<?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 } ?>