Сеансы PHP завершаются раньше срока

У меня проблемы с сайтом 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 -Патч 0.9.6.2 (cli) (последняя версия в Lenny, мы скоро перейдем на Squeeze, но я не думаю, что это причина проблемы).

Мы используем Zend_Session для управления сеансами, и экземпляр Zend_Session_Namespace создается один раз на каждой странице, таким образом автоматически вызывая session_start ().Сеансы очищаются путем вызова Zend_Session :: destroy () на странице выхода, поэтому единственные способы выхода пользователя из системы:

  • Если они явно щелкают ссылку выхода (мы регистрируемся, когда это происходит, и это не кажется в том случае, если при просмотре выполняется предварительная загрузка страницы и, таким образом, выход пользователя из системы).
  • Если они оставят сеанс неактивным более 24 минут, в этот момент Debian, вероятно, удалит их сеанс (есть задание cron, которое запускается каждые полчаса, удаляя все сеансы, которые не были изменены более 24 минут).
  • Если они закроют браузер, их сессионный куки-файл со сроком действия 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).
7
задан pwaring 21 September 2011 в 11:07
поделиться