У меня проблемы с сайтом PHP, который я запускаю на работе, где пользователи выходят из системы через несколько минут (точное время меняется, но достаточно часто, чтобы вызывать проблемы), независимо от того, были ли они активно используя сайт или нет.
Сложность в том, что я не могу воспроизвести эту проблему, если я захожу под тем же пользователем, используя тот же браузер, я не выхожу из системы, что говорит о том, что сайт не полностью сломан. К сожалению, у меня нет доступа к пользовательским машинам для запуска какого-либо программного обеспечения для отслеживания трафика.
Вещи, которые я уже проверил:
- Попросить пользователей попробовать разные браузеры. Похоже, это не решает проблему и не является долгосрочным решением, так как я не могу определить, какие браузеры будут использовать клиенты.
- Время сервера правильное и соответствует пользовательским машинам.
- Пользователь Apache запускается с правами доступа для записи в папку сеанса, и я вижу, как создаются файлы сеанса и время их изменения обновляется.
- Функции буферизации вывода не используются.
- Проблема возникает на разных страницах, которые, похоже, не имеют ничего общего (т.е. дело не в том, что они все используют AJAX, или обновляют базу данных, или по какой-то другой причине).
- Пользователи получают доступ к своей учетной записи только с одного компьютера, то есть они не выполняют небольшую работу на своем ноутбуке, переключаются на рабочий стол и затем задаются вопросом, почему они вышли из системы на своем ноутбуке (мы не разрешаем несколько одновременный вход в систему для одного и того же пользователя).
Настройки сеанса в PHP являются значениями по умолчанию Debian и не были изменены ни в файле .htaccess, ни где-либо еще. Основные из них:
session.cookie_lifetime 0
session.gc_divisor 100
session.gc_maxlifetime 1440
session.gc_probability 0
session.save_handler files
session.save_path /var/lib/php5
session.use_cookies On
Debian удаляет сессии с помощью задания cron вместо использования сборщика мусора PHP, поэтому gc_probability имеет значение 0. Версия PHP, которую мы используем: PHP 5.2.6-1 + lenny13 с Suhosin-Patch 0.9.6.2 (cli) (последняя версия в Lenny, мы скоро перейдем на Squeeze, но я не думаю, что это является причиной проблемы).
Мы используем Zend_Session для управления сеансами, и экземпляр Zend_Session_Namespace создается один раз на каждой странице, таким образом автоматически вызывая session_start (). Сеансы очищаются путем вызова Zend_Session :: destroy () на странице выхода из системы, поэтому единственные способы выхода пользователя из системы:
- Если они явно нажимают на ссылку выхода из системы (мы регистрируем, когда это происходит, и не похоже, что при просмотре страницы происходит предварительная загрузка страницы и, таким образом, вывод пользователя из системы).
- Если они оставляют сеанс неактивным более чем на 24 минуты, в этот момент Debian, вероятно, удалит их сеанс (есть задание cron, которое выполняется каждые полчаса, удаляя все сеансы, которые не были изменены в течение более 24 минут).
- Если они закроют браузер, их сеансовый cookie со временем истечения 0 будет удален.
Проверяет, вошел ли пользователь в систему:
- У них есть действительный сеанс (проверяется, видим ли мы доступ к $ zsession-> user_id).
- В таблице сеансов есть строка с совпадающим идентификатором пользователя и идентификатором сеанса, и последнее обновление было выполнено менее часа назад. Мы удаляем эту строку при выходе из системы, чтобы, даже если сеанс все еще существует на диске, никто не может получить доступ к этой учетной записи без входа в систему.
Кто-нибудь может предложить другие вещи, которые я могу попробовать?
Редактировать: некоторые дополнительные вещи, которые я пробовал на основе оставленных комментариев:
- Установка session.cookie_domain: Это кажется очень странным поведением в PHP. Если я не установлю эту переменную и оставлю ее в качестве значения по умолчанию '' (пустая строка), то запрос на www.domain.com приведет к созданию файла cookie для www.domain.com. Однако, если я установлю cookie_domain на «www.domain.com», доменом для cookie будет «.www.domain.com» (обратите внимание на начальную точку, что означает действительный для всего, что ниже www.domain.com, например subsite.www .domain.com).
- Установка session.cookie_lifetime: похоже, PHP не обновляет время истечения для каждого запроса, поэтому, если я установлю cookie_lifetime на 3600, cookie истекает через час после первого посещения сайта пользователем, даже если он входит в систему и постоянно использует его. .
Редактировать 2: На основании других вопросов, которые люди спрашивали:
- Сайт размещается в центре обработки данных, в отдельной VLAN. Никто, заходящий на сайт, не находится в той же сети, что и сайт.
- Не используется ни аутентификация IP, ни IP-адрес клиента, который используется в какой-либо части процесса сеанса (например, мы не привязываем сеанс к IP-адресу и не блокируем пользователя, если его следующий запрос поступает от другой IP).