2011-12-31 21 views
6

Tôi đang sử dụng khung công tác zend. Đôi khi tôi muốn vô hiệu hóa hoặc xuống trang web của tôi cho thời gian cụ thể để bảo trì. Vậy làm cách nào để ngăn mọi người truy cập vào bất kỳ trang nào trên trang web của tôi khi cần?Làm thế nào để vô hiệu hóa trang web cho thời gian cụ thể trong khuôn khổ zend?

Nút thắt ở đâu trong khung công tác Zend nơi tôi có thể dừng tất cả yêu cầu và ngừng người dùng tiếp tục.

Cảm ơn

Trả lời

7

Phần khó khăn khi thực hiện việc này trong phạm vi ứng dụng ZF có thể là việc bảo trì của bạn sẽ ảnh hưởng đến chính ứng dụng đó. Vì vậy, nếu ứng dụng bị "hỏng" trong quá trình bảo trì, rủi ro là giải pháp "trong ứng dụng" có thể bị hỏng. Theo nghĩa đó, các phương pháp "bên ngoài" như sửa đổi .htaccess hoặc tinh chỉnh tệp public/index.php có lẽ mạnh mẽ hơn.

Tuy nhiên, cách tiếp cận "trong ứng dụng" có thể sử dụng plugin trình điều khiển phía trước. Trong 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'); 
     } 
    } 
} 

Sau đó đăng ký các plugin trong 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); 
} 

Trong thực tế, bạn có thể muốn đẩy thời gian bắt đầu/kết thúc lên đến config. Trong application/configs/application.ini:

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

Sau đó, bạn có thể sửa đổi các đăng ký plugin để trông giống như:

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

Bằng cách này, bạn có thể kích hoạt chế độ bảo trì đơn giản bằng cách chỉnh sửa các mục config.

+0

@Iznogood: Cảm ơn bạn đã chỉnh sửa. D'oh! ;-) –

+0

Không có vấn đề gì xảy ra! :) – Iznogood

7

Thật đơn giản.

Sử dụng htaccess viết lại và chuyển hướng tất cả yêu cầu trên một trang tạm thời tĩnh thay vì gửi chúng đến bootstrap hoặc index tập tin

+0

Cảm ơn. Nó luôn luôn là khó khăn cho tôi để chỉnh sửa '.htaccess' :) Có anyway trong khuôn khổ zend? – Student

+0

Nó không phải là khó khăn. chỉ cần mở .htaccess nó sẽ nằm trong thư mục gốc và chỉnh sửa nó –

7

Nguyên tắc viết lại trong các tuyến đường tập tin .htaccess tất cả lưu lượng thông qua index.php, vì vậy nếu bạn không thể thay đổi .htaccess chỉ cần đặt dòng sau vào tệp index.php của bạn trước bất kỳ công cụ liên quan đến ZF nào.

$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; 
} 

Bằng cách này, không có mã liên quan đến ZF nào được thực thi trong thời gian bảo trì.

Các vấn đề liên quan