Php 如何设计一个';只读';站点模式?

Php 如何设计一个';只读';站点模式?,php,mysql,laravel,maintenance-mode,Php,Mysql,Laravel,Maintenance Mode,我注意到,在Stack Overflow和Reddit等网站上,它们能够将整个网站置于“只读”模式,例如在维护期间 我的问题是,需要什么样的体系结构来实现这一点?它是否发生在数据库级别,即某些用于“锁定”数据库写入的命令?这是一个有点宽泛的问题,所以缩小范围,我对以下方面的实现感兴趣: PHP MySQL 拉维尔 数据库本身是否被锁定,我们无法确定。 但我想说,这是不可能的,特别是因为您无论如何都必须更改前端行为,以避免大量错误消息 相反,所有接口(前端和API,如果存在)都被告知锁定,可能是

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

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

  • PHP
  • MySQL
  • 拉维尔

    • 数据库本身是否被锁定,我们无法确定。
      但我想说,这是不可能的,特别是因为您无论如何都必须更改前端行为,以避免大量错误消息

      相反,所有接口(前端和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
      中是不够的).

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