如何实施维护模式/路由约束?

时间:2015-03-26 22:28:11

标签: php zend-framework2 url-routing

我想实现维护模式。我正在考虑检查所有控制器的所有方法,每个方法都扩展AbstractActionController类。

目标是简单地检查布尔标志以查看维护模式是否打开,如果是,则显示包含维护消息的HTML页面(例如,我们当前正在执行维护。请在几分钟后再次检查)< / p>

不是手动执行每个功能中的检查,如何设置在进行任何路由之前执行的检查?

2 个答案:

答案 0 :(得分:0)

我已经使用BaseController类中的MVC“dispatch”事件成功实现了此解决方案(扩展了AbstractResultfulController类,这也是我的大多数操作控制器的基类)。

public function setEventManager(EventManagerInterface $events) {
    parent::setEventManager($events);
    $events->attach('dispatch', array($this, 'checkMaintenance'), 10);
    return $this;
}

public function checkMaintenance() {
    $response = $this->getResponse();

    $message = $this->getMaintenanceModeMessageOrFalse();
    if (false !== $message) {
        $response->setStatusCode(503);
        $response->setContent($message);
        return $response;
    }
}

public function getMaintenanceModeMessageOrFalse() {
    return "We're currently performing maintenance. Please check back again in a few minutes.";
}

答案 1 :(得分:0)

我认为创建静态维护页面的最佳方法是在http服务器级别处理此要求,就在客户端的实际请求传递给应用程序之前。

这意味着,您可以在不启动应用程序的情况下显示维护页面。此方法也比任何应用程序级解决方案快得多。

对于nginx,你可以尝试这样的事情:

location / {
  if (-f $document_root/maintenance.html) {
    return 503;
    }
  # ... your current configuration goes here ...
}

error_page 503 @maintenance;

location @maintenance {
  # This will be catch any type of request
  rewrite ^(.*)$ /maintenance.html break;
}

对于apache:

RewriteEngine On

RewriteCond %{DOCUMENT_ROOT}/maintenance.html -f
RewriteCond %{REQUEST_FILENAME} !/maintenance.html
RewriteCond %{ENV:REDIRECT_STATUS} !=503
RewriteRule ^.*$    /maintenance.html [L,R=503] 

通过这种方式,在您的站点根目录中放置maintenance.html文件就足以将整个站点切换为访问者的维护模式。

完成维护后,您可以删除该文件。 (重命名将在以后再次使用)。

希望它有所帮助。