Пользователи жалуются на ранний тайм-аут: возможно ли окончание сессии PHP? - PullRequest
0 голосов
/ 19 сентября 2019

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

Вот все, что я пробовал:

  • Все страницы начинаютсясо следующим, который увеличивает максимальное время жизни сеанса, назначает выделенный путь сохранения для переменной сеанса, устанавливает параметры cookie сеанса равными 0 и запускает сеанс:

    ini_set('session.gc_maxlifetime', 3600);
    ini_set('session.save_path', 'C:\path\to\session_folder');
    session_set_cookie_params(0);
    session_start();
    
  • Запрос на публикациюотправляется каждые пять минут на страницу, которая обновляет сеанс, снова запуская приведенный выше код ^:

    setInterval(function() { $.post('refresh_session.php'); }, 1000 * 300); 
    
  • refresh_session.php также переназначает переменные сеанса для дальнейшего предотвращения истечения срока действия / тайм-аута:

    if (isset($_SESSION['username'])) {
      $_SESSION['username'] = $_SESSION['username'];
    }
    if (isset($_SESSION['access'])) {
      $_SESSION['access'] = $_SESSION['access'];
    }
    if (isset($_SESSION['LAST_ACTIVITY'])) {
      $_SESSION['LAST_ACTIVITY'] = $_SERVER['REQUEST_TIME'];
    }
    
  • Для элемента управления кэшем установлено значение «без кэша», не уверены, что это имеет значение?:

    header('Cache-Control', 'no-cache');
    

Вот 2 таймаута:

  • JavaScript:

    //Log out user after 30 mins no activity
    if (<?php echo json_encode($_SESSION['username']); ?> != "admin") {
      (function() {
        let lastAct = Date.now();
    
        document.onmousemove = function() {
          lastAct = Date.now();
        }
    
        document.onclick = function() {
          lastAct = Date.now();
        }
    
        document.onscroll = function() {
          lastAct = Date.now();
        }
    
        document.onkeypress = function() {
          lastAct = Date.now();
        }
    
        setInterval(function() {
          let diff = Date.now() - lastAct;
          if (diff > 1000 * 1800) {
            window.location.href = <?php echo json_encode($LoginLoc); ?>
          }
        }, 1000 * 300);
      } ());
    }      
    
  • PHP:

    //Check current time
    $time = $_SERVER['REQUEST_TIME'];
    
    //Session expires after 60 mins no page requests
    if (isset($_SESSION['LAST_ACTIVITY']) && ($time - $_SESSION['LAST_ACTIVITY']) > 3600) {
      header('Location:' . $LoginLoc);
    }
    
    //Check time of last activity
    $_SESSION['LAST_ACTIVITY'] = $time;
    

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

  • На всех страницах пользователь будетперенаправляется на страницу входа в систему, если не задана переменная сеанса имени пользователя, и сценарий также заканчивается:

    if (!isset($_SESSION['username']) || empty($_SESSION['username'])) {
      header('Location:' . $LoginLoc);
      die();
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...