CakePHPで簡単にメンテナンスモードを実装するMaintenanceコンポーネントを書いてみたよ。

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.phpConfigureクラスを利用して指定したり、コンポーネントの指定時に設定する方法しか利用できません。

そのため、注釈にbootstrap.phpのみ等と書いてある項目に関しては、設定のタイミングを間違える(例えば、bootstarp.phpと書いてある項目をController::beforeFilterで設定する等)と正しく動作しませんので、ご注意下さい。

level (int) ※bootstrap.php、またはコンポーネントの指定時のみ
メンテナンスモードのレベルを設定します。
0 – メンテナンスモードを利用しません。
1allowedCIDRで指定されたIPアドレス帯域以外からのアクセスは、強制的にデバッグレベルを0にします。
2allowedCIDRで指定された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に指定したデバッグレベルでアクセスする事ができるので、小さなバグの検証などにも利用できるかと思います。