2017-01-05 4 views
1

Предисловие: это «развитие» от an earlier question шахты, чьи ответы не решить мою проблему, в конце концов. Но через пробуя все предложения, а также пытаются другие вещи, я обнаружил, что реальная проблема заключается в чем-то еще, так что я перефразирую свой вопрос здесь

У меня Войти страницу/система, которая работала правильно в течение многих лет, в результате чего пользователь вошел в систему до тех пор, пока он не закрывает окно браузера или не выйдет из системы вручную. Но в последнее время после нескольких минут бездействия сеанс 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 сессии ID сохранял то же значение после того, как сеанс, похоже, истек (о чем я думал, поскольку переменные сеанса исчезли). Но сессия не закончилась, только исчезли переменные сеанса. В моих тестах я попытался повторить некоторые из этих переменных на некоторых страницах, и случайно случайно обнаружил, что после того, как они уже исчезли (нет эхо-выхода), снова появился через несколько минут, когда я перезагрузил страницу или перешел на другую страницу.

Теперь вот где я застрял в данный момент: как это может произойти, и особенно: что я могу сделать, чтобы эти переменные не играли в прятки?

(кстати, у меня нет доступа к настройкам сервера - это на общедоступном вебпространства ...)

+0

Если версии php были изменены, проверьте, были ли изменены и изменены ли параметры жизни cookie сеанса. Это все, что я могу получить от этого. Что показывает 'phpinfo()'? –

+0

Проверьте настройки php.ini, такие как @ Fred-ii-, но также, и я знаю, что это звучит глупо, проверьте свой код на '$ _SESSION [.....] = ....' когда вы действительно имели в виду ' $ _SESSION [.....] == .... 'Очень часто пропущенная опечатка. – Chris

+0

Является ли это единственным сервером или несколькими серверами за балансировщиком нагрузки? ;) –

ответ

1

Это не решение, просто тест для случая я написал в комментариях , Не могли бы вы попробовать это?

<?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 
) 
+0

Возможно, вы правы, но это время довольно непредсказуемо. До сих пор это колебалось от 3 минут до 6 часов ... Причина, по которой я думаю, что это может быть правдой, - это невоспроизводимое наблюдение, которое я сделал, - я вошел в систему как другой пользователь после того, как первое соединение не удалось, а затем повторил второй пользователь какое-то время (час?), и внезапно получилось, что данные первого повторились снова ... Но в любом случае - что я могу сделать, если это так? – Johannes

+0

@ Johannes: если это так, то вы можете связаться с провайдером или сохранить данные сеанса в таблице базы данных: (sess_id, data, last_access_time) и т. Д. Кроме того, дважды проверьте возможность того, что другое приложение на одном и том же хост отпускает тот же сеанс. Чтобы исключить это, просто измените имя файла cookie на что-то еще. –

1

Для тех, кто заинтересован:

Очевидно @Crouching Котик был прав - поставщик имеет архитектуру с несколькими машинами за балансировки нагрузки или что-то подобное, и нет ничего, что я могу сделать по этому поводу.

Итак, я взял его совет и теперь сохранил все, что было сеансом varibles до (вместе с идентификатором сеанса) в базе данных, к которой я обращаюсь в начале каждой страницы этого веб-сайта. Я также сохраняю там временную метку, которая обновляется каждым новым запросом, содержащим один и тот же идентификатор сеанса, поэтому я могу настроить cronjob, который удаляет устаревшие данные (старше 90 минут, но этот интервал может быть любым) каждые полчаса.

+0

Я настоятельно рекомендую обработчик сеанса на основе memcached. Это быстрее и все в памяти, имеет очень мало места, имеет TTL, не имеет блокировки файлов (у HHVM нет блокировки на сессионных файлах, тоже, похожее поведение), и вы можете иметь все данные сеанса на всех веб-серверах. – DanFromGermany

+0

К сожалению, у меня нет возможности изменять настройки сервера (за исключением ini_set() и связанных с ним вещей). Я - простой клиент довольно негибкого провайдера. – Johannes

+0

Это было бы неприемлемо для меня. Когда вы платите за него, но он работает только в особых случаях (когда пользователь попадает на тот же серверный компьютер с каждым запросом), это хорошая причина немедленно отказаться от контракта или даже попросить вернуть свои деньги. – DanFromGermany