Как построить в "режиме обслуживания" в Codeigniter?

Я использую последний codeigniter, и мне нужно создать флаг (в идеале в конфигурации) при включении "true", все страницы отображают сообщение "режим обслуживания" вместо выполнения кода контроллера.

какова лучшая / самая простая практика для этого?

6 ответов


расширьте CI_Controller, поместив новый файл в основной каталог с именем MY_Controller.

в конструкторе этого файла сделайте что-то вроде этого:

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

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

пусть все контроллеры в вашем приложении наследуют от этого класса.


вот мое решение, отлично работает для меня:

ниже будет вызывать maintanance.php сразу, так что вы можете идти вперед и сломать свой код CI без того, чтобы мир видел его.

также позволит вам добавлять свои собственные IP-адрес, так что вы все еще можете получить доступ к сайту для тестирования и т. д.

в индекс.в 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');
?>

вот мое решение, просто, чисто и эффективно для всех 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";";
}

создать метод техническое обслуживание in: приложение/контроллеры/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>

Как насчет этого :

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

следующий шаг-создать страницу контроллера для обслуживания.


вот что я придумал для создания режима обслуживания.

  1. включить крючки в конфиге.файл php
  2. создайте error_maintenance.страница php в папке ошибок
  3. создать крюк под названием обслуживание
  4. в настройке конфигурации hooks ваш вызов hooks для запуска 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>

приложения/хуки/ремонт.в 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;
      }
   }
}

application / config / hooks.в PHP

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

этот работает хорошо,

application/views / 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 () очень importantn не забудьте положить его внизу, это предотвратит отображение всех страниц.

приложения/библиотеки/ремонт.в 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;

        }
    }

}

автоматическая загрузка библиотеки, поэтому она будет проверять каждую загрузку страницы.

теперь вы можете активировать и деактивировать режим обслуживания путем ввода или