Как создать режим сайта "только для чтения"?
Я заметил, что на таких сайтах, как Stack Overflow и Reddit, они могут перевести весь сайт в режим "только для чтения", например, во время обслуживания.
У меня вопрос, какая архитектура нужна, чтобы это произошло? Происходит ли это на уровне базы данных, то есть какая-то команда блокирует запись в базу данных? Это довольно широкий вопрос, поэтому, чтобы сузить его, я заинтересован в реализации:
- PHP
- MySQL
- Laravel
1 ответ
Заблокирована ли сама база данных или нет, мы не можем определить.
Но я бы сказал, что это маловероятно, тем более что вам все равно придется изменить поведение внешнего интерфейса, чтобы избежать множества сообщений об ошибках.
Вместо этого всем интерфейсам (внешним интерфейсам и API-интерфейсам, если они есть) предписывается заблокировать, предположительно, через переменную конфигурации, и затем они не будут выполнять никаких операций записи в базу данных и, возможно, даже использовать локальный кэш вместо чтения из базы данных.
У меня нет инсайдерской информации о Stackru, но я не могу придумать, как это могло бы работать должным образом.
Что касается вашей "реализации":
На уровне 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>
не достаточно).