Как перезапустить Apache без перезагрузки пользовательских сессий?


8

Пользователь вошел на сайт PHP> Я перезагружаю Apache> Пользователь должен снова войти в систему.

Как это предотвратить? (Я не хочу, чтобы пользователь должен был снова войти в систему)


Чтобы проверить: у вас есть возможность редактировать PHP, верно?
Питер Тейлор

Если это ваше собственное приложение, я бы предложил то, что предложил @Jacob Hume ниже, и изменил бы ваше приложение для хранения сеансов в таблице базы данных. Это дает вам больше контроля, по моему мнению, над вашим сайтом, так как вы можете заставить пользователей выходить из системы при необходимости выборочно.
Анагио

Я могу редактировать PHP. Я использую CMS (Drupal). Я также использую APC и искал решение таким образом.
Dowik

Ответы:


6

Хранение маркера сеанса в другом месте в качестве резервной копии предотвратит эту проблему. Вы по-прежнему можете хранить свою основную информацию $_SESSION, но хранить резервный токен в:

  • Печенье
  • База данных записей
  • HTML5 локальное хранилище

Вы можете найти некоторую помощь в этом вопросе StackOverflow: лучшие практики для тайм-аутов сессии и постоянный вход в php .


Спасибо за ответ и спасибо за ссылку. Я искал решение для файла конфигурации на стороне сервера (вроде «сохранить сессии при перезапуске»). Но похоже, что решение находится на стороне приложения.
Dowik

О, мой ... На самом деле я просто искал "apache2ctl -k изящный"!
Dowik

3

Ваши данные сеанса не должны быть потеряны только потому, что Apache выключен или перезапущен, если только данные сеанса не сохраняются в памяти и не сохраняются на диск (файловой системой или базой данных). В противном случае вы могли бы перезапустить весь сервер, и сеанс все равно продолжится. Данные сеанса предназначены для длительного хранения. Единственный раз, когда сеанс потерян, если:

  1. SID потерян. Данные сеанса все еще существуют на стороне сервера, но клиент не может восстановить SID, поэтому не может повторно инициировать тот же сеанс. Это может произойти, если срок действия файла cookie SID истекает (если это файл cookie) или ссылки на сеанс теряются (если SID является параметром URL) или SID сбрасывается на стороне сервера или изменяется без уведомления клиента.

  2. Данные сеанса удаляются на стороне сервера. Обычно это происходит, когда PHP Session Garbage Collector запускается и видит, что файл сессии старше, чем session.gc_maxlifetime (по умолчанию это 24 минуты). В противном случае это может произойти, если приложение явно удалит сеанс . На некоторых серверах администратор также может настроить cronjob для регулярной очистки старых данных сеанса.


Спасибо за подробности. Я буду исследовать этот путь. Но сейчас я просто воспользуюсь изящным перезапуском, который, кажется, соответствует моим потребностям.
Dowik

@dowik: Как изящный перезапуск соответствует вашим потребностям? Ваша проблема - потеря сеансов или прерванные загрузки? Если это последнее, то корректный перезапуск / выключение действительно решит это. Но тогда вы должны отредактировать свой вопрос, чтобы отразить это. Потому что изящные перезапуски не имеют ничего общего с сессиями PHP, и это не поможет другим пользователям, пытающимся предотвратить потерю сессий.
Lèse Majesté

Я попытался обновить заголовок моего вопроса, заменив «сеансы PHP» на «сеансы пользователей», как описано в основной части моего вопроса. Для тебя лучше? Чтобы быть более точным: я использую APC. Когда я изменяю код в файлах PHP, мне нужно очистить кэш APC (перезапустить Apache - самый простой способ сделать это, я знаю). С аргументом "перезагрузка" пользователи моего сайта должны снова войти в систему. В то время как с "изящными" они не делают. Вот почему "это, кажется, соответствует моей потребности".
Dowik

@dowik: я не думаю, что это имеет какое-либо отношение к изящному перезапуску. Скорее всего, вы только что перезагрузили компьютер, который совпал с сборщиком мусора на PHP-сессиях. Войдите снова и попробуйте выполнить регулярный перезапуск сразу после этого Если вы не сохраняете сеансы в памяти (MM), сеанс будет сохранен.
Lèse Majesté

1

Это стало возможным благодаря использованию правильного аргумента с Apache:

apache2ctl -k graceful

Apache перезапустится без потери текущих сеансов.


2
Изящный перезапуск только откладывает отключение до тех пор, пока не прервутся текущие соединения. Это не меняет поведение перезапуска.
Lèse Majesté
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.