【问题标题】:approach for "site down for maintenance"“站点停机维护”的方法
【发布时间】:2010-12-22 17:18:25
【问题描述】:

我一直在使用 Joomla,我喜欢它的管理设施,可以让网站停止维护。正如我所看到的,如果站点处于维护模式,则对站点的所有请求都将路由到单个页面。如果我想为非 Joomla 站点添加我自己的“站点停机维护”模块,我该怎么做?我在 PHP 中使用了一个名为 Kohana 的 MVC 框架,其版本 2 与 Codeigniter 类似。我有一个路由器类,我可以控制某个地址的去向。我能想到的唯一方法是在站点关闭时将每个请求重定向到特定的控制器功能,但我该怎么做呢?我不可能手动重新路由所有 url,对吗?

【问题讨论】:

    标签: php kohana


    【解决方案1】:

    你可以检查一个公共标题中的数据库标志(假设你有一些连接到数据库的公共包含等),如果设置了标志,则呈现特定页面并退出(确保完成所有通常的清理工作,例如关闭数据库连接等)。

    【讨论】:

      【解决方案2】:

      看看路由documentation。您应该能够使用将任何 uri 重定向到特定控制器/操作的正则表达式。剩下的唯一问题是如何打开/关闭该规则。

      【讨论】:

        【解决方案3】:

        我可以想到两个想法来实现这一点。

        1. 就像拉里所说,使用正则表达式将所有请求重定向到特定位置。因此,首先您将确定站点是否处于维护模式(可能使用数据库标志或配置文件设置),然后如果是,则使用路由的正则表达式功能将所有流量重定向到一个地方。

        2. 您可以在每个控制器的构造函数中检查站点是否处于维护模式,并根据需要进行重定向。这可能不是最佳解决方案,因为您将为每个控制器重复相同的代码。所以,即使它可以工作,你可能会更好地使用正则表达式。

        Kohana 中的路由:http://docs.kohanaphp.com/general/routing

        PHP 正则表达式:http://www.php.net/manual/en/reference.pcre.pattern.syntax.php

        Kohana 中的控制器:http://docs.kohanaphp.com/general/controllers

        【讨论】:

          【解决方案4】:

          您正在运行 Apache 吗?将此添加到 Web 根目录中的 .htaccess 文件(或站点的​​ vhost 声明),以将所有请求重定向到“维护中”页面:

          Redirect 301 / /maintenace_page.html

          【讨论】:

          • 那很好,但如果我愿意,我可以用 php 脚本将其关闭吗?
          • 当然。只需使用 PHP 脚本编辑 .htaccess 并将 Redirect 301 / /maintenace_page.html 替换为 #Redirect 301 / /maintenace_page.html - # 表示注释行,并且不会执行重定向。
          【解决方案5】:

          在您的 index.php 中定义一个名为 IN_MAINTENANCE 的常量

          hook file 中像这样创建回调:

          function in_maintenance()
          {
              if(IN_MAINTENANCE)
              {
                   Router::$controller = 'my_maintenance_controller';
                   Router::$method = 'index';
              }
          }
          

          并将其添加到 system.post_routing 事件中。

          Event::add('system.post_routing', 'in_maintenance');
          

          当您上传您的网站时,将 IN_MAINENANCE 的值更改为 TRUE,所有请求都将被重定向到您的维护页面。

          有关创建挂钩的更多信息,请参阅Event / Hook documentation

          【讨论】:

            【解决方案6】:

            另一种切换方法是检查文件:如果存在,则维护开始,因此关闭网站。

            如果是这样,您可以执行上述任何操作。

            【讨论】:

              【解决方案7】:

              Kohana 3: 您可以在 bootstrap.phpKohana::modules() 行之前定义一条包罗万象的路线:

              if (/* check if site is in under maintenance mode */) {
                  Route::set('defaulta', '(<id>)', array('id' => '.*'))
                      ->defaults(array(
                          'controller' => 'errors',
                          'action'     => 'maintenance',
                      ));
              }
              

              或者你甚至可以处理做同样事情的请求:

              if (/* check if site is in under maintenance mode */) {
                  echo Request::factory('errors/maintenance')
                      ->execute()
                      ->send_headers()
                      ->response;
              }
              

              Kohana 2: 您需要扩展 Controller 并处理构造函数中的“维护中”页面显示(但您需要确保所有控制器都扩展此控制器类而不是原始控制器类):

              abstract class Custom_Controller extends Controller {
              
                  public function __construct()
                  {
                      parent::__construct();
                      if (/* check if site is in under maintenance mode */) {
                          $page = new View('maintenance');
                          $page->render(TRUE);
                          exit;
                      }
                  }
              }
              

              或者您甚至可以使用挂钩系统来执行此操作,方法是在您的 hooks 文件夹中添加一个文件(确保在您的 config.php 中启用挂钩):

              Event::add('system.ready', 'check_maintenance_mode');
              
              function check_maintenance_mode() {
                  if (/* check if site is in under maintenance mode */) {
                      Kohana::config_set('routes', array('_default' => 'errors/maintenance'));
                  }
              }
              

              如您所见,实际上在 Kohana 中有很多方法可以做事,因为它是一个非常灵活的 PHP 框架 :)

              【讨论】:

                猜你喜欢
                • 2010-09-24
                • 1970-01-01
                • 2017-11-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-26
                • 1970-01-01
                • 2011-03-13
                相关资源
                最近更新 更多