その他
    ホーム 技術発信 DoRuby CakePHPでRailsのように環境設定に応じて必要なパラメータを変更する方法

    CakePHPでRailsのように環境設定に応じて必要なパラメータを変更する方法

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    TrinityTです!!

    最近CakePHPの仕事をしています。

    Railsライクな構成のため比較的容易に開発を進められたのですが、残念なことに「環境名に応じて設定値を切り替える」方法がありませんでした。

    今回はこれを解決する方法について説明します。

     前提

    Railsでの環境設定方法

    ・「ルートディレクトリ/config/environment.rb」に全環境共通の設定を記述

    ・「ルートディレクトリ/config/environments/環境名.rb」に各環境ごとの設定を記述

    CakePHPでの環境設定方法

    ・「ルートディレクトリ/config/bootstrap.php」に環境設定を記述

    →環境ごとの設定という概念が無い!デプロイのたびに逐次変更する必要があるので非常に面倒。

    目標

    ローカル開発環境(develpment)、テストサーバ環境(integration)、本番サーバ環境(production)でシームレスに環境設定を切り替えられるようにする!

     説明

    方針

    ・環境名はApacheに独自定義。

    ・「ルートディレクトリ/config/bootstrap.php」に全環境共通の設定を記述

    ・「ルートディレクトリ/config/bootstraps/環境名.php」に各環境ごとの設定を記述

     手順

    1. Apacheに独自環境名設定

    Railsでは起動時に環境変数を指定しますが、CakePHPではこの概念が無いためApacheの設定ファイル(httpd.conf等)にSetEnvで独自パラメータを設定します。

    ここでは「CAKE_ENV_MODE」という変数を定義することにしました。

    ローカル開発環境(development)

    ※後述する振り分けでは「本番orテストサーバorそれ以外」という条件にするため、設定しなくても問題無いです。

      DocumentRoot /var/www/html
    ...  
      SetEnv CAKE_ENV_MODE "development" 
    ...
    
    テストサーバ(integration)
      DocumentRoot /var/www/html
    ...  
      SetEnv CAKE_ENV_MODE "integration" 
    ...
    
    本番サーバ(production)
      DocumentRoot /var/www/html
    ...  
      SetEnv CAKE_ENV_MODE "production" 
    ...
    

    2. 各環境ごとの設定ファイルを作成

    「ルートディレクトリ/config/bootstraps/環境名.php」のファイルを作成します。

    この例では「LOG_PATH」の設定を行っています。

    ローカル開発環境(config/bootstraps/development.php)
    <?php
    Configure::write("LOG_PATH", "/var/log/development/cake.log");
    ?>
    
    テストサーバ(config/bootstraps/integration.php)
    <?php
    Configure::write("LOG_PATH", "/var/log/integration/cake.log");
    ?>
    
    本番サーバ(config/bootstraps/production.php)
    <?php
    Configure::write("LOG_PATH", "/var/log/production/cake.log");
    ?>
    

    3. 設定ファイル読み込み

    作成した各環境毎の設定ファイルを読み込む処理をconfig/bootstrap.phpに設定します。

    ...
    // Apacheで設定した環境名を読み込む
    $env = empty($_SERVER['CAKE_ENV_MODE']) ? '' : $_SERVER['CAKE_ENV_MODE'];
    
    // 環境名に応じて設定ファイルを読み込む
    switch ($env) {
     case 'production':
       require_once('bootstraps' . DS . 'production.php');
       break;
     case 'integration':
       require_once('bootstraps' . DS . 'integration.php');
       break;
     default:
       require_once('bootstraps' . DS . 'development.php');
    }
    

    これにより各環境で「LOG_PATH」変数を意識せずに設定が切り替えることができるようになりました。

     おわりに

    いかがだったでしょうか?

    PHPの場合「レンタルサーバで運用しているのでApacheの設定はいじれない!」などの制約が考えられるため、

    他の方法を行う必要があるかもしれません。

    参考になれば幸いです。