如何设计“只读”网站模式?

时间:2015-04-22 14:04:02

标签: php mysql laravel maintenance-mode

我注意到Stack Overflow和Reddit这样的网站,他们能够将整个网站置于'只读'模式,例如在维护期间。

我的问题是,需要什么样的架构来实现这一目标?它是否发生在数据库级别,即某些命令“锁定”数据库写入?这是一个广泛的问题,所以为了缩小它,我对以下的实现感兴趣:

  • PHP
  • MySQL的
  • Laravel

1 个答案:

答案 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); 的同样原因是不够的。)