Как построить в "режиме обслуживания" в 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>
Как насчет этого :
- создайте автоматически загружаемые библиотеки, которые всегда проверяют флаг обслуживания в вашей базе данных.
- создайте модуль для управления флагом обслуживания приложения.
- создать модуль для перенаправления, когда режим обслуживания
автоматически загружаемые библиотеки могут содержать что-то вроде этого :
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'));
}
}
следующий шаг-создать страницу контроллера для обслуживания.
вот что я придумал для создания режима обслуживания.
- включить крючки в конфиге.файл php
- создайте error_maintenance.страница php в папке ошибок
- создать крюк под названием обслуживание
- в настройке конфигурации 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;
}
}
}
автоматическая загрузка библиотеки, поэтому она будет проверять каждую загрузку страницы.
теперь вы можете активировать и деактивировать режим обслуживания путем ввода или