2015-04-22 2 views
-1

Я замечаю, что на таких сайтах, как Stack Overflow и Reddit, у них есть возможность поместить весь сайт в режим «только для чтения», например. во время технического обслуживания.Как создать режим «только для чтения»?

Вопрос в том, какая архитектура необходима для этого? Это происходит на уровне базы данных, т. Е. Некоторая команда «блокировать» запись базы данных? Это немного обширный вопрос, так сужать его вниз, я заинтересован в реализации для:

  • PHP
  • MySQL
  • Laravel
+4

Нет, база данных не будет установлена ​​в режиме только для чтения, хотя вы также можете сделать это с надежной стороны. Просто заблокируйте пользовательский интерфейс. Вы хотите, чтобы этот флаг был доступен везде, а может быть, метод getter в базовом классе контроллера? – halfer

+0

может быть чем-то таким же простым, как установка 'readonly = 1' в конфигурационном файле где-нибудь, и каждый блок кода, который выполняет операции записи, проверяет этот флаг. Установка DB только для чтения будет работать, но, скорее всего, убьет всю базу кода, потому что любой запрос на запись завершится неудачей, и повсюду выплюнуть «фатальную ошибку: не удается записать ваши изменения». –

+0

Вам действительно нужно решить, какие самые дорогие (и часто наименее важные) операции на сайте, а затем добавить механизмы для их отключения. В случае Reddit, который включает в себя логины пользователей, голосование вверх/вниз, публикацию и комментирование. Ненавижу быть клевером, но если бы у вас не было высокого представителя, я бы увидел, что этот вопрос будет закрыт и опущен довольно быстро. Я чувствую, что этот вопрос лучше подходит для программистов.stackexchange.com? – sjagr

ответ

1

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

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

У меня нет инсайдерской информации о StackOverflow, но я не могу придумать другого способа, которым это могло бы работать должным образом.

Что касается вашего «реализации»:

На уровне MySQL вы не должны действительно сделать что-либо, тем более, что вы, вероятно, нужно изменить некоторые вещи в базе данных во время охранение.

В PHP, вы можете сделать что-то подобное для API, или все GET/POST целевых страниц:

if(!$config['readonly']) 
{ 
    $db->query('UPDATE `someTable` SET `whatever` = "whocares"'); 
} 

и то же самое для переднего конца:

$template->renderViewButton(); 
if(!$config['readonly']) 
{ 
    $template->renderUpdateButton(); 
    $template->renderLikeButton(); 
} 

Просто скрыть какие-либо элементы которые меняют вещи в базе данных, и не забудьте также, чтобы ограничить принимающие страницы, так как любой, у кого есть некоторые знания об образовании, может создать свой собственный HTTP-запрос и, возможно, сломает ваш сайт, если вы его не защитите (по той же причине добавление readonly в HTML <input> недостаточно).

Смежные вопросы