2011-12-31 12 views
6

Używam Zend Framework. Czasami chcę wyłączyć lub obniżyć moją witrynę o określony czas na konserwację. Jak więc w razie potrzeby powstrzymać ludzi przed dostępem do dowolnej strony mojej witryny?Jak wyłączyć witrynę w określonym czasie w strukturze Zend?

Gdzie jest wąskie gardło w Zend Framework, gdzie mogę zatrzymać wszystkie żądania i zatrzymać użytkownika, aby kontynuować.

Dzięki

Odpowiedz

7

Podstępna część robienia tego w aplikacji ZF polega na tym, że prawdopodobnie konserwacja wpłynie na samą aplikację. Jeśli więc aplikacja zostanie "zerwana" podczas konserwacji, istnieje ryzyko, że rozwiązanie "w aplikacji" może również ulec uszkodzeniu. W tym sensie "zewnętrzne" podejścia, takie jak modyfikowanie .htaccess lub poprawianie pliku public/index.php, są prawdopodobnie bardziej niezawodne.

Jednak metoda "w aplikacji" może korzystać z wtyczki kontrolera frontowego. W application/plugins/TimedMaintenance.php:

class Application_Plugin_TimedMaintenance extends Zend_Controller_Plugin_Abstract 
{ 
    protected $start; 
    protected $end; 

    public function __construct($start, $end) 
    { 
     // Validation to ensure date formats are correct is 
     // left as an exercise for the reader. Ha! Always wanted 
     // to do that. ;-) 

     if ($start > $end){ 
      throw new Exception('Start must precede end'); 
     } 

     $this->start = $start; 
     $this->end = $end; 
    } 

    public function routeShutdown(Zend_Controller_Request_Abstract $request) 
    { 
     $now = date('Y-m-d H:i:s'); 
     if ($this->start <= $now && $now <= $this->end){ 
      $request->setModuleName('default') 
        ->setControllerName('maintenance') 
        ->setActionName('index'); 
     } 
    } 
} 

Następnie zarejestrować wtyczkę w application/Bootstrap.php:

protected function _initPlugin() 
{ 
    $this->bootstrap('frontController'); 
    $front = $this->getResource('frontController'); 
    $start = '2012-01-15 05:00:00'; 
    $end = '2012-01-15 06:00:00'; 
    $plugin = new Application_Plugin_TimedMaintenance($start, $end); 
    $front->registerPlugin($plugin); 
} 

W praktyce, może chcesz przesunąć razy start/end do konfiguracji. W application/configs/application.ini:

maintenance.enable = true 
maintenance.start = "2012-01-15 05:00:00" 
maintenance.end = "2012-01-15 06:00:00" 

Następnie można zmodyfikować rejestrację wtyczki wyglądać:

protected function _initPlugin() 
{ 
    $this->bootstrap('frontController'); 
    $front = $this->getResource('frontController'); 
    $config = $this->config['maintenance']; 
    if ($config['enable']){ 
     $start = $config['start']; 
     $end = $config['end']; 
     $plugin = new Application_Plugin_TimedMaintenance($start, $end); 
     $front->registerPlugin($plugin); 
    } 
} 

W ten sposób, można włączyć tryb konserwacji po prostu edytując wpis konfiguracyjny.

+0

@Iznogood: Dzięki za edycję. D'oh! ;-) –

+0

Nie dzieje się problemów! :) – Iznogood

7

To proste.

Zastosowanie htaccess przepisać i przekierować wszystkie żądania na statycznym tymczasowej stronie zamiast wysyłać je do bootstrap lub index pliku

+0

Dzięki. Zawsze jest mi trudno edytować '.htaccess' :) Czy tak jest w Zend Framework? – Student

+0

To nie powinno być trudne. po prostu otwórz. Htaccess będzie w folderze głównym i edytuj go –

7

reguła przepisać w .htaccess trasach plików cały ruch przez index.php, więc jeśli nie można zmienić .htaccess po prostu umieść następującą linię w twoim index.php przed jakimkolwiek materiałem związanym z ZF.

$maintenanceStart = new DateTime('2012-01-01 00:00:00'); 
$maintenanceEnd = new DateTime('2012-01-01 01:00:00'); 
$now = new DateTime; 
if ($now > $maintenanceStart && $now < $maintenanceEnd) { 
    fpassthru('/path/to/your/maintenancePage.html'); 
    exit; 
} 

W ten sposób żaden kod związany z ZF nie zostanie wykonany w oknie konserwacji.

Powiązane problemy