2015-04-22 74 views
-1

我注意到像堆栈溢出和Reddit这样的网站,他们有能力将整个网站置于“只读”模式,例如在维护期间。如何设计“只读”网站模式?

我的问题是,需要什么样的架构才能做到这一点?它是否发生在数据库级别,即某些用于“锁定”数据库写入的命令?这是一个有点宽泛的问题,所以将它缩小我感兴趣的实现:

  • PHP
  • MySQL的
  • Laravel
+4

不,数据库不会设置为只读模式,尽管您也可以这样做以确保安全。只需锁定用户界面。你会希望这个标志在任何地方都可用,所以也许在基础控制器类中有一个getter方法? – halfer

+0

可能与将'readonly = 1'设置在某个配置文件中一样简单,并且每个编写操作的代码块都会检查该标志。设置数据库只读是可行的,但最有可能杀死整个代码库,因为任何写入查询都会失败,并且无处不在地发出“致命错误:无法写入更改”。 –

+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>是不够的)。