Nullyのぶろぐ

仙台から東京へ転勤したエンジニアのブログ

Zend Frameworkで簡易メンテナンスモード

久しぶりのZendFrameworkネタ!

ちょっとうきうき[wp_emoji2 code="d231" alt="うれしい顔"]

いろいろなPHPフレームワークで簡易的なメンテナンスモードを実施している方達がいるので、ZendFrameworkでもやってやろうじゃないか!と躍起になってみました[wp_emoji2 code="d139" alt="ハートたち (複数ハート)"]

メンテナンスモードのControllerを作る

大前提として、メンテナンスモードを実行するための簡単なControllerとActionを書くか、zf コマンドなどで吐いてください。

Maintenance_Controller extends Zend_Controller_action {

public function indexAction() {

}

}

表示ファイルを用意する

メンテナンスモードだよ!と表示するためのビューファイルを「applications/views/scripts/maintenance/index.phtml」に用意します。

<h1>メンテナンス中</h1>

<p>メンテ終わるまでしばらくまっててください!</p>

Controllerプラグインを作る

Controllerプラグインは、Controllerの処理前/後に割り込無ことができる機構です。

このControllerプラグインには、複数の起動ポイントがあります。

そのうち今回使うのは、routeShutdown(ルーティング処理完了後に呼び出される)を利用します。

class My_Controller_Plugin_Maintenace extends Zend_Controller_Plugin {

public function routeShutdown(Zend_Controller_Request_Abstract $request) {

$request->setActionName("index");

$request->setControllerName("maintenance");

// モジュールを動作させているならば

// $request->setModuleName("default"); // モジュール名を指定します。

}

}

のような形でControllerプラグインを作ります。

起動コードに書き足す

最後にapplication.iniに以下のような記述で、frontControllerがControllerPluginを実行出来る形で登録してあげます。

resources.frontController.plugins[] = "My_Controller_Plugin_Maintenance"

もしくは、Bootstrap.php

:

: // 中略

:

// メンテナンスモードを実行するプラグインを登録します。

protected function _initControlerPluginMaintenanceMod() {

$this->bootstrap("frontController");

$front = $this->getResource("frontController");

$front->registerPlugin(new My_Controller_Plugin_Maintenance());

}

以上で、超絶簡易的なメンテナンスモードを実装することができます。※ページ下部ご意見を参照

メンテナンスって英語のスペルが合ってるかいまいちで、久しぶりのZFネタで登録ポイント等を大方忘れておりますが、小さい脳みそ搾り出しました。

終わりに

簡易的なということで、管理者等でも強制的にメンテナンスモードを表示する素敵コードですが、ControllerプラグインにてIPの縛りを設けたりするコードを記述することで、規制緩和も行えるかと思います。

メンテナンスモード重要だよ!

参考

追記

Controllerプラグインで利用できるメソッド(起動ポイント)は以下を参考にしてください。

Zend Framework - Zend_Controller - プラグイン

さらに追記

元ネタ(?)は以下の内容のようでした。

Webアプリフレームワークの「簡単メンテナンスモード」コンテストにエントリーされる方はいらっしゃいませんか。http://d.hatena.ne.jp/tanakahisateru/20110527/1306495794 (いろんなフレームワークの性格が見えて面白いと思う)

http://twitter.com/tanakahisateru/status/74078560624721920

ご意見

@heavenshellさんからのご意見

resource.frontController.plugins[] = "My_Controller_Plugin_Maintenance";の箇所を都度コメントアウトするなりで対応はできなくはないですが、運用時に問題のが出てくることもあります。

が、今回は、簡易ということなので...orz

Bootstrapから起動する場合は、やはり、applications.iniにオプションを指定できるようにメンテナンスモード自体をリソース化してしまい、オプションにより起動を分けるか、@heavenshellさんの手法で管理するのが良いかと思います。

@heavenshellさんご指摘ありがとうございます!


@noopableさんからのご意見

APPLICATION_ENV定数を定義し、その内容によりBootstrapコードを書き分けるとの事です。

このやり方だと、メンテナンスモードのBootstrapと公開用Bootstrapなどのように、起動コードの切り分け、及び必要最低限のプラグインやリソースの設定が可能になります。

@noopableさん、ありがとうございます!

変更履歴

  • routeShudownをrouteShutdownに記述変更(打ちミス)
  • @heavenshellさんからのご指摘を追加
  • @noopableさんからのご意見を追加
  • いただいたご意見やご指摘をページ下部に移動
  • メンテナンスモードリソースのGistをざっと作成