Предисловие : это «развитие» из более раннего моего вопроса , ответы которого в конце концов не решили мою проблему. Но, пробовав все предложения, а также попробовав другие вещи, я обнаружил, что реальная проблема – это что-то еще, поэтому я перефразирую свой вопрос здесь
У меня есть страница / система входа в систему, которая работала корректно в течение многих лет, в результате чего пользователь вошел в систему, пока он или она не закрывает окно браузера или не выходит из системы вручную. Но в последнее время после нескольких минут бездействия сеанс cookie / s, казалось, истек, в результате чего пользователь автоматически выходил из системы.
Это происходит в разных браузерах и разных операционных системах, версия PHP – 5.6.29, которая недавно была изменена (до того, как она была 5.5 и даже 5.3).
Я создаю и обновляю сеанс на каждой странице с помощью session_start()
. Сначала скрипт входа в систему проверяет имя пользователя и PW, а также получает некоторые другие пользовательские данные из базы данных. Эти другие данные и успешное состояние входа сохраняются в переменных сеанса, таких как
$_SESSION['username'] = $name; $_SESSION['usertype'] = $type; $_SESSION['login'] = "ok";
На других страницах я проверяю состояние входа следующим образом:
session_start(); if(($_SESSION['login'] != "ok") OR ($_SESSION['usertype'] != "xxx")) { header("Location: ../login.php"); /* redirects to login page if conditions are not true */ exit; }
Вход в систему работает, и зарегистрированные пользователи могут перейти на другие страницы в течение некоторого времени, но через некоторое время (сильно меняется) он / она, кажется, выйдет из системы (т.е. перенаправляется на страницу входа при попытке открыть другую страницу).
Затем я заметил (в инструментах разработчика), что cookie идентификатора сеанса сохранил то же значение после того, как сеанс, похоже, истек (о чем я думал, поскольку переменные сеанса исчезли). Но сеанс не закончился, только переменные сеанса исчезли . В моих тестах я попытался повторить некоторые из этих переменных на некоторых страницах, и случайно случайно обнаружил, что после того, как они уже исчезли (без выхода эха), они снова появились через несколько минут, когда я перезагрузил страницу или перешел на другую страницу.
Теперь вот где я застрял в данный момент: как это может произойти, и особенно: что я могу сделать, чтобы эти переменные не играли в прятки?
(BTW, у меня нет доступа к настройкам сервера – это на общем веб-пространстве …)
Это не решение, просто тест для случая, о котором я писал в комментариях. Не могли бы вы попробовать это?
<?php $number = (int)$_GET["number"]; $temp_dir = "/tmp/lbtest123"; if (!is_dir($temp_dir)) { if (!mkdir($temp_dir, 0777, true)) { die("Can't create directory: $temp_dir"); } } file_put_contents($temp_dir."/".$number.".txt", ""); echo "<pre>\n"; print_r(glob($temp_dir."/*.txt")); echo "</pre>";
Скопируйте это на свой сервер. Он создает файлы в папке / tmp / lbtest123, используя номер, переданный в качестве параметра. Затем перечислены файлы, которые уже созданы.
Назовите его с увеличением числа, за тот же промежуток времени, который вы ожидаете от выхода из системы. Пример:
Пример результата:
Array ( [0] => /tmp/lbtest123/1.txt [1] => /tmp/lbtest123/2.txt [2] => /tmp/lbtest123/3.txt [3] => /tmp/lbtest123/4.txt )
Я ожидаю, что через некоторое время это будет выглядеть так:
Array ( [2] => /tmp/lbtest123/4.txt [3] => /tmp/lbtest123/5.txt ) Array ( [0] => /tmp/lbtest123/1.txt [1] => /tmp/lbtest123/2.txt [2] => /tmp/lbtest123/3.txt [3] => /tmp/lbtest123/6.txt )
Для всех, кто заинтересован:
Очевидно, что @Crouching Kitten был прав – у провайдера есть архитектура с несколькими машинами за балансиром нагрузки или что-то подобное, и я ничего не могу с этим поделать.
Поэтому я принял его совет и теперь сохраняю все, что было сеансом varibles до (вместе с идентификатором сеанса) в базе данных, к которой я обращаюсь в начале каждой страницы этого веб-сайта. Я также сохраняю там временную метку, которая обновляется каждым новым запросом, содержащим один и тот же идентификатор сеанса, поэтому я могу настроить cronjob, который удаляет устаревшие данные (старше 90 минут, но этот интервал может быть любым) каждые полчаса.