CakePHPで開発したアプリケーションを公開する際、たとえばバグの修正やデータベースのアップデートを行う場合など、サイトの全機能をいったん止めて、バックエンドで作業したいことがあるかと思います。
エントリポイントであるAPP/webroot/index.php
を差し替えるという強硬手段もあるかと思いますが、もっと手軽に実現するためのMaintenanceコンポーネントを作成してみたので公開します。
利用可能な環境
下記環境で作成・テストを行っています。
- PHP 5.3.1
- CakePHP 1.3.11
PHP4系列では動作しません。
また、CakePHP1.2以前では動作するかわかりません。
ダウンロードと設置
下記ソースコードを、maintenance.php
としてAPP/controllers/components
/以下に配置してください。
組み込み
基本的に1つだけのコントローラーをメンテナンスモードにする、というのもあまり考えられないと思うので、AppController
自体に組み込んでおくと良いです。
class AppController extends Controller { public $components = array('Maintenance'); }
設定
Maintenanceコンポーネントを動作させる上での設定を、下記の何れかの方法で設定を行います。
Configureクラスを利用する場合
bootstrap.php
などの設定ファイルに記述する際にこちらの方法を使います。
Configure::write('Maintenance.level', 2); Configure::write('Maintenance.errorMethod', 'error404');
コンポーネントの指定時に設定を行う場合
class AppController extends Controller { public $components = array('Maintenance' => array( 'level' => 2, 'errorMethod' => 'error404', ); }
Controller::beforeFilterメソッドを利用する場合
class AppController extends Controller { public $components = array('Maintenance'); public function beforeFilter() { $this->Maintenance->level = 1; $this->Maintenance->errorMethod = 'error404'; } }
利用出来る設定の一覧
下記の項目を設定可能です。
動作の仕様上、コンポーネントのコンストラクタで利用する設定や、Component::initialize
メソッドの実行時に利用する設定もあるため、そういった設定はbootstrap.php
でConfigure
クラスを利用して指定したり、コンポーネントの指定時に設定する方法しか利用できません。
そのため、注釈にbootstrap.phpのみ等と書いてある項目に関しては、設定のタイミングを間違える(例えば、bootstarp.php
と書いてある項目をController::beforeFilter
で設定する等)と正しく動作しませんので、ご注意下さい。
- level (int) ※bootstrap.php、またはコンポーネントの指定時のみ
-
メンテナンスモードのレベルを設定します。
0
– メンテナンスモードを利用しません。
1
–allowedCIDR
で指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にします。
2
–allowedCIDR
で指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にした上で、メンテナンス画面へリダイレクトします。 - debug (int) ※bootstrap.phpのみ
-
allowedCIDR
で指定されたIPアドレス帯域でアクセスした場合のデバッグレベルを設定します。 - allowedCIDR (array) ※bootstrap.php、またはコンポーネントの指定時のみ
-
メンテナンスモードの影響を受けないIPアドレスをCIDRの形式で記述します。
level
が1以上の時にここで指定されたIPアドレス帯域でアクセスすると、debug
で指定されたデバッグレベルでアプリケーションが実行されます。
配列を利用する事で複数のパターンを指定する事が可能です。
例)192.168.0.1/32
- baseURL (mixed)
-
アプリケーションのホームURLを文字列またはCakeURLの形式で指定します。
level
が2の時にこれ以外のURLにアクセスがあった場合、このURLにリダイレクトした後にメンテナンス画面を表示させます。 - errorMethod (string)
-
メンテナンス画面を表示するためのエラーメソッドの名前を指定します。
内部的にはObject::cakeError
メソッドを利用しているため、cakeError
クラスもしくはappError
クラスに定義されているメソッド名を指定します。(デフォルトではerror404
です) - errorParams (array)
- エラーメソッドに渡すパラメータを配列で指定します。
利用方法
上記設定を参考に、適切な設定を行うだけでOKです。
あとは必要に応じてlevel
を2に変更する事で、すぐさまアプリケーション全体をメンテナンス中にすることができます。
その際、allowedCIDR
に指定されたIPアドレス帯域からは、debug
に指定したデバッグレベルで通常通りのアクセスが可能なため、通常のユーザーにはメンテナンス中を表示させ、その間に管理者がシステムのアップデートやバグの調査などを行う事が可能になります。
level
が1の場合は、通常のユーザーはデバッグレベル0、許可されたIPアドレス帯域からはdebug
に指定したデバッグレベルでアクセスする事ができるので、小さなバグの検証などにも利用できるかと思います。