【问题标题】:How to design a 'read only' site mode? [closed]如何设计“只读”站点模式? [关闭]
【发布时间】:2015-04-22 14:04:02
【问题描述】:

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

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

  • PHP
  • MySQL
  • Laravel

【问题讨论】:

  • 不,数据库不会设置为只读模式,但为了安全起见,您也可以这样做。只需锁定用户界面。你会希望这个标志在任何地方都可用,所以可能是基控制器类中的 getter 方法?
  • 可能很简单,例如在某个配置文件中设置readonly=1,并让每个执行写入操作的代码块检查该标志。将数据库设置为只读会起作用,但很可能会杀死整个代码库,因为任何写入查询都会失败,并到处吐出“致命错误:无法写入您的更改”。
  • 你真的只需要决定网站上最昂贵(通常也是最不重要)的操作是什么——然后添加机制来禁用它们。在 reddit 的案例中,这包括用户登录、赞成/反对投票、发帖和评论。讨厌成为一个坚持者,但如果你没有高级代表,我会看到这个问题很快就被关闭并被否决。我觉得这个问题更适合programmers.stackexchange.com?
  • @MarcB:尽管:-),这将是对错误处理程序稳健性的一个很好的测试

标签: php mysql laravel maintenance-mode


【解决方案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> 是不够的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2016-04-02
    • 2011-08-01
    • 2012-09-27
    • 2010-10-11
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多