我注意到Stack Overflow和Reddit这样的网站,他们能够将整个网站置于'只读'模式,例如在维护期间。
我的问题是,需要什么样的架构来实现这一目标?它是否发生在数据库级别,即某些命令“锁定”数据库写入?这是一个广泛的问题,所以为了缩小它,我对以下的实现感兴趣:
答案 0 :(得分:1)
数据库本身是否被锁定,我们无法确定 但我会说这不太可能,特别是因为你必须改变前端行为,以避免大量的错误信息。
相反,所有接口(前端和API,如果存在)被告知锁定,可能是通过配置变量,然后不会对数据库执行任何写操作,甚至可能使用本地缓存而不是读取数据库。
我没有关于StackOverflow的内幕消息,但我无法想到任何其他可以正常工作的方式。
至于你的"实施":
在MySQL级别上,你不应该做任何事情,特别是因为你可能需要在维护期间更改数据库中的一些东西。
在PHP中,您可以为API或所有GET / POST目标页面执行类似的操作:
$template->renderViewButton();
if(!$config['readonly'])
{
$template->renderUpdateButton();
$template->renderLikeButton();
}
和前端相同:
readonly
只需隐藏任何可以改变数据库中内容的元素,并且不要忘记来限制接收页面,因为任何具有一些开发知识的人都可以制作自己的HTTP请求并且可能如果您没有保护它,请将您的网站破坏(将<input>
添加到// command array
$command = array(
'command' => 'login',
'arguments' => array(
'userId' => 'xxxxxx',
'password' => 'xxxxxx',
'appId' => 'test',
'appName' => 'test',
),
);
$fp = stream_socket_client("ssl://xapia.x-station.eu:5124", $errno, $errstr, 30);
if (!$fp) {
die("Unable to connect: $errstr ($errno)");
}
/* Turn on encryption for login phase */
fwrite($fp, json_encode($command));
while ($motd = fgets($fp)) {
echo $motd;
echo '<hr />';
}
fclose($fp);
的同样原因是不够的。)