9

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

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

4

7 回答 7

35

这是我的解决方案,对我来说很好:

下面将立即调用 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();

    }
}

在与 index.php 相同的文件夹中添加文件 Maintanance.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');
?>
于 2013-10-09T09:39:54.257 回答
24

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

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

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

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

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

于 2013-03-22T14:27:42.160 回答
7

这是我的解决方案,简单、干净、有效地适用于所有 url 调用和 SEO 方面:


将此变量添加到: application/config/config.php

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

在末尾添加这个条件: application/config/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');
}

创建视图: application/views/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>
于 2016-11-09T09:32:32.720 回答
3

这是我想出的创建维护模式的方法。

  1. 在 config.php 文件中启用 Hooks
  2. 在errors文件夹下创建error_maintenance.php页面
  3. 创建一个名为维护的 Hook
  4. 在钩子配置设置中,您的钩子调用以在 post_controller 上运行

应用程序/错误/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;
      }
   }
}

应用程序/config/hooks.php

$hook['post_controller'][] = array(
   'class' => 'maintenance',
   'function' => 'maintenance',
   'filename' => 'maintenance.php',
   'filepath' => 'hooks',
   'params' => array()
);
于 2013-10-01T20:02:34.230 回答
2

这个怎么样 :

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

自动加载的库可以包含如下内容:

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'));
    }
}

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

于 2013-03-22T14:29:08.127 回答
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;

        }
    }

}

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

现在您可以通过键入或激活和停用维护模式

于 2015-02-04T10:57:24.733 回答
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”页面。

于 2021-02-24T15:19:09.283 回答