Как лучше всего отключить сайт и выкинуть пользователей для обновления? - PullRequest
9 голосов
/ 20 марта 2009

Мне интересно, как люди выгоняют людей или блокируют доступ к сайту, когда вы хотите выполнить обновление и у вас есть пользователи, которые вошли в систему.

Моя единственная мысль - просто поместить настройку bool в глобальный файл (например, файл настроек), чтобы узнать, доступен ли сайт. Истина доступна, в то время как ложь недоступна. Если задано значение false, то в следующий раз, когда пользователь попытается получить доступ к сайту, он либо выйдет из системы, либо будет просто представлен недоступным сообщением.

При использовании этого метода я вижу 2 проблемы:

  1. Если пользователи просто заканчивают заполнять длинную форму или пишут большую часть текста (например, новый вопрос или ответ на SO), как только они отправят форму, они потеряют эту информацию. (Не всегда можно сохранить его, потому что, возможно, изменения БД для этой таблицы или кода уже изменились.)

  2. Возможно: на занятом сайте редактирование глобального файла, если его длина превышает пару строк, может привести к ошибкам синтаксического анализа PHP, если эта страница загружена во время частичной загрузки или при сохранении. В зависимости от конфигурации могут также возникать проблемы с блокировкой файла.

Другой вариант - иметь поле в базе данных с той же настройкой. На данный момент у меня обычно нет таблицы настроек, так что это будет единственное в таблице, но я вижу, что она быстрее, так как избегает второй проблемы.

Есть ли что-то, что вы использовали, что сработало, или какие-то другие идеи?

Я работаю с LAMP.

Ответы [ 6 ]

3 голосов
/ 20 марта 2009

Возможно, вы захотите использовать перенаправление веб-сервера. В случае Apache, файл .htaccess для перенаправления (или перезаписи URL) пользователей на страницу статического обслуживания:

RewriteRule ^updating.*$ $0 [NC,U,QSA,L]
RewriteRule .* /updating/ [NC,U,QSA,R=307,L]

Если вы хотите получить доступ к сайту самостоятельно, находясь в режиме обслуживания, вы можете прикрепить к заголовку useragent специальную и, как мы надеемся, уникальную строку:

RewriteRule ^updating.*$ $0 [NC,U,QSA,L]
RewriteCond %{HTTP:User-Agent} !MY-CUSTOM-UA-STRING [NC]
RewriteRule .* /updating/ [NC,U,QSA,R=307,L]

Вот как манипулировать вашим пользовательским агентом в Firefox:

Создайте новый about:config ключ с именем general.useragent.extra.XYZ и установите его как "MY-CUSTOM-UA-STRING" или что-либо еще, что вы пожелаете. Firefox прикрепит строку к UA.

Если вы используете Chrome, попробуйте новую функцию Mobile Emulation , которая позволяет изменять строку пользовательского агента непосредственно из devtools.

Как вы уже упоминали, альтернативным решением может быть установка флага конфигурации на стороне сервера. Прежде чем сделать это, я предлагаю вам сохранить все текущие операции пользователя на сайте и позволить ему возобновить их после периода обслуживания. Также заранее сообщите им точное время технического обслуживания.

3 голосов
/ 20 марта 2009

Вы можете реализовать поле состояния, возможно, в стиле AJAX, например оранжевую полосу в верхней части страниц StackOverflow, которое информирует пользователей о том, что сайт будет закрыт через 10-15 минут или что у вас есть. Вы также можете отключить вход в систему в течение этого времени. Затем просто полностью отключите сайт, выполните обновление и включите его.

3 голосов
/ 20 марта 2009

Заранее проинформируйте пользователей о том, что у вашего сайта будет время простоя в указанное время, а затем выполните обновление в часы, которые вы используете в наименьшее время, в соответствии с вашими файлами журнала. Выходные отлично подходят для обновления, если ваш сайт важен для ваших пользователей. Небольшое время простоя в воскресенье утром около 3 часов утра, вероятно, не рассердит слишком многих пользователей. Просто убедитесь, что у вас есть все, что вам нужно, до того, как вы выполните обновление, чтобы минимизировать время простоя. Вы можете даже попробовать выполнить пробный запуск на тестовом сервере.

1 голос
/ 20 марта 2009

Это похоже на предложение Бобби. Способ, которым я достиг того же самого, состоит в том, чтобы поместить пару значений в таблицу «config» в базе данных, одно из которых - это дата / время для сбоя системы, а другое - сообщение.

Как только поле даты не станет нулевым, заблокируйте все входы в систему и при каждом обновлении страницы просто используйте предупреждение javascript, чтобы отобразить сообщение для пользователей, объясняющее, что сайт будет закрыт через X минут, по причине Y и должен вернуться в онлайн через Z минут. Это раздражающий способ сделать это лично, но очень важно, чтобы они осознали, что не должны начинать заполнять действительно длинную форму.

Как только наступит время начала обслуживания, загрузите всех пользователей при обновлении их следующей страницы. ... кроме администраторов, конечно.

Заставить всех клиентов периодически опрашивать сервер на предмет проверки на предстоящий период обслуживания - это излишне, ИМО. Если у вас есть пара страниц, которые имеют действительно длинные формы, возможно, добавьте опрос AJAX только для этих страниц.

Наличие такого рода значений в базе данных легко реализуемо, довольно гибко и идеально подходит для этой ситуации.

1 голос
/ 20 марта 2009

Как насчет того, чтобы просто не позволять новым пользователям входить в систему и отслеживать количество вошедших в систему пользователей, пока оно не достигнет 0, а затем вы можете выполнить обновление?

0 голосов
/ 20 марта 2009

Если ваша система основана на сеансах, проще всего изменить имя сеанса. Имя файла cookie изменится, и никто не получит новый, пока они не войдут снова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...