如何在Codeigniter中构建“维护模式”?

时间:2013-03-22 14:17:13

标签: php codeigniter

我正在使用最新的codeigniter,我需要在转为'true'时创建一个标志(理想情况下在配置中),所有页面都显示“维护模式”消息,而不是执行其控制器代码。

这样做的最佳/最简单的做法是什么?

7 个答案:

答案 0 :(得分:32)

这里我的解决方案适用于我:

下面会立即调用maintanance.php,这样你就可以继续打破你的CI代码,而不会让全世界都看到它。

还允许您添加自己的IP地址,以便您仍然可以访问该站点进行测试等。

在index.php中添加顶部:

$maintenance = false; ## set to true to enable

if ($maintenance)
{
    if (isset( $_SERVER['REMOTE_ADDR']) and $_SERVER['REMOTE_ADDR'] == 'your_ip')
    {
        ##do nothing
    } else
    {

        error_reporting(E_ALL);
        ini_set('display_errors', 1); ## to debug your maintenance view

        require_once 'maintenance.php'; ## call view
        return;
        exit();

    }
}

将文件Maintanance.php添加到与index.php相同的文件夹中(或上面的更新路径):

<!DOCTYPE html>

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Maintenance</title>

        <style>
            body {
                width:500px;
                margin:0 auto;
                text-align: center;
                color:blue;
            }
        </style>
    </head>

    <body>

        <img src="images/home_page_logo.png">

        <h1><p>Sorry for the inconvenience while we are upgrading. </p>
            <p>Please revisit shortly</p>
        </h1>
        <div></div>

        <img src="images/under-maintenance.gif"   >

    </body>
</html>
<?php
header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 3600');
?>

答案 1 :(得分:22)

通过在您的核心目录中放置一个名为MY_Controller的新文件来扩展CI_Controller。

在这个文件的构造函数中,执行以下操作:

public function __construct()
{
    parent::__construct();

    if($this->config->item('maintenance_mode') == TRUE) {
        $this->load->view('maintenance_view');
        die();
    }
}

让您应用中的所有控制器都继承该类。

答案 2 :(得分:4)

这里我的解决方案,简单,干净,有效地用于所有网址调用和SEO方面:

将此变量添加到: 的应用/配置/ config.php中

$config['maintenance_mode'] = TRUE;
$config['maintenance_ips'] = array('0.0.0.0', '1.1.1.1', '2.2.2.2');

在结尾处添加此条件: 的应用/配置/ routes.php文件

if(!in_array($_SERVER['REMOTE_ADDR'], $this->config->item('maintenance_ips')) && $this->config->item('maintenance_mode')) {
    $route['default_controller'] = "your_controller/maintenance";
    $route['(:any)'] = "your_controller/maintenance";";
}

在以下位置创建方法维护 application / controllers / your_controller .php

function maintenance() {
     $this->output->set_status_header('503'); 
     $this->load->view('maintenance_view');
}

创建视图: 的应用/视图/ maintenance_view.php

<!DOCTYPE html>
<html>
   <head>
      <title>Maintenance</title>
   </head>
   <body>
      <p>We apologize but our site is currently undergoing maintenance at this time.</p>
      <p>Please check back later.</p>
   </body>
</html>

答案 3 :(得分:2)

怎么样:

  1. 创建自动加载的库,始终检查数据库上的维护标志。
  2. 创建一个用于控制应用程序维护标志的模块。
  3. 创建一个模块,用于在维护模式开启时重定向
  4. 自动加载的库可以包含以下内容:

    class Maintenance_mode {
        function __construct(){
            $CI =& get_instance();
            $check_maintenance = $CI->db->select('flag_mode')->get('tbl_settings')->result();
            if($check_maintenance[0]->flag_mode == '1') 
                redirect(site_url('maintenance_mode_controller'));
        }
    }
    

    下一步是为维护页面创建一个控制器。

答案 4 :(得分:2)

以下是我为创建维护模式而提出的建议。

  1. 在config.php文件中启用挂钩
  2. 在错误文件夹
  3. 下创建error_maintenance.php页面
  4. 创建名为维护的挂钩
  5. 在hooks config设置中,你的钩子调用在post_controller上运行
  6. 应用/错误/ error_maintenance.php

    <!DOCTYPE html>
    <html>
      <head>
        <title>Maintenance</title>
        <style>Style your page</style>
      </head>
      <body>
        <p>We apologize but our site is currently undergoing maintenance at this time.</p>
        <p>Please check back later.</p>
      </body>
    </html>
    

    应用/钩/ maintenance.php

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class maintenance
    {
       var $CI;    
       public function maintenance()
       {
          $this->CI =& get_instance();
          $this->CI->load->config("config_maintenance");    
          if(config_item("maintenance"))
          {
              $_error =& load_class('Exceptions', 'core');
              echo $_error->show_error("", "", 'error_maintenance', 200);
              exit;
          }
       }
    }
    

    应用/配置/ hooks.php

    $hook['post_controller'][] = array(
       'class' => 'maintenance',
       'function' => 'maintenance',
       'filename' => 'maintenance.php',
       'filepath' => 'hooks',
       'params' => array()
    );
    

答案 5 :(得分:0)

这个很好用,

<强>应用/视图/ vw_maintenance.php

    <!DOCTYPE html>
    <html>
      <head>
        <title>Maintenance</title>
        <style>Style your page</style>
      </head>
      <body>
        <p>We apologize but our site is currently undergoing maintenance at this time.</p>
        <p>Please check back later.</p>
      </body>
    </html>
<?php exit(); ?>

exit()函数非常重要,不要忘记把它放在底部,它会阻止所有页面显示。

<强>应用/库/ maintenance.php

class Maintenance{

    private $CI;

    public function __construct() {

        $this->CI =& get_instance();

        // flag on and off
        $this->flag( $this->CI->uri->segment(1) );

        // get the flag status
        $check_maintenance = $this->CI->db->select('flag_mode')->where(array('setting_name' => 'maintenance'))->get('tbl_settings')->result();

        //display view if true
        if($check_maintenance[0]->flag_mode == '1')
            $this->CI->load->view('vw_maintenance');


    }

    private function flag($command){


        $this->CI->db->where('setting_name', 'evolving');

        switch($command){

            case "activate":                
                $this->CI->db->update('tbl_settings', array('flag_mode' => 1) ); 
            break;

            case "deactivate":
                $this->CI->db->update('tbl_settings', array('flag_mode' => 0) );
                redirect(site_url('/'));
            break;

        }
    }

}

自动加载库,以便检查每个页面加载。

现在您可以通过键入或

来激活和停用维护模式

答案 6 :(得分:0)

我认为这很简单,只需在构造函数上调用视图,如下所示。

评论(网站将上线)

class home extends CI_Controller {

public function __construct() {
    parent::__construct();
    //echo $this->load->view('maintenance','',true);exit;
    }
}

取消注释(网站将在维护中)

class home extends CI_Controller {

public function __construct() {
    parent::__construct();
    echo $this->load->view('maintenance','',true);exit;
    }
}

并且您可以在 CI 应用程序的“视图”下使用您自己的“maintenance.php”页面。