我想实现维护模式。我正在考虑检查所有控制器的所有方法,每个方法都扩展AbstractActionController
类。
目标是简单地检查布尔标志以查看维护模式是否打开,如果是,则显示包含维护消息的HTML页面(例如,我们当前正在执行维护。请在几分钟后再次检查)< / p>
不是手动执行每个功能中的检查,如何设置在进行任何路由之前执行的检查?
答案 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
文件就足以将整个站点切换为访问者的维护模式。
完成维护后,您可以删除该文件。 (重命名将在以后再次使用)。
希望它有所帮助。