本番環境と開発環境の差異を吸収する server_dependence.php

webプログラミングを行っている方は、開発するためのwebサーバを用意して、その中で開発を行っていることと思います。

【server_dependence】は、【サーバ依存】という意味があり、開発環境のPCと本番環境のPCの差異を吸収させることが目的になります。

他のPHPプログラムは全て【program】というディレクトリの中に格納しますが、server_dependence.phpだけは、programディレクトリの外に設置します。

こうすることで、開発環境で行った変更は、programディレクトリをまるごとアップロードすることで本番環境に適用することができるようになります。

さて、それでは、server_dependence.php のコードを解説していきましょう。
初期の設置時だけでなく、修正・更新時も視野に入れて考えます。
解説の都合で、コードを分割していますが、実際はserver_dependence.php内に記述します。

出力メディア

そのアクセスに対する出力は、PCですか?携帯電話ですか?それともテレビでしょうか?
本ファイルの趣旨としてここで定義すべきではないのですが、下記の【アクセス解析】で必要となるため、ここに記述します。

<?php
  // 出力メディア
  define("C_PC", "pc");
  define("C_MOBILE", "mobile");
  define("C_TV", "tv");

インストールするディレクトリが異なる

本番用ではプログラムを格納するディレクトリが異なってしまうことがあります。特にレンタルサーバをご利用の場合、開発と本番を全く同じ環境にするのは難しいかと思います。
また、windowsで開発してlinuxで本番運用なんてケースもなきにしもあらずです。
ディレクトリ構成を、絶対パスで定数宣言しておきます。

  // 本システムに割り当てられたルートからのパス
  //define('C_PATH_ROOT', '/hoge/'); // Transfer.php で定義するため不要
 // ドキュメントルート
  define('C_PATH_PUBLIC', C_PATH_ROOT. 'public_html/');
  // プログラムコードを格納
  define('C_PATH_PROGRAM', C_PATH_ROOT . 'program/');
  // class定義ファイルを格納
  define('C_PATH_CLASS', C_PATH_PROGRAM . 'class/');
  // キャッシュファイルやログファイルなどを格納
  define('C_PATH_CACHE', C_PATH_PROGRAM . 'cache/');
  // セッション情報を格納 (session.save_path)
  define('C_PATH_SESSION', C_PATH_CACHE. 'session/');
  // ページ固有の処理 (Model, View)
  define('C_PATH_CACHE', C_PATH_PROGRAM . 'MV_');
  // 共通処理 (Model)
  define('C_PATH_CACHE', C_PATH_PROGRAM . 'M_common/');
  // 共通処理 (View)
  define('C_PATH_CACHE', C_PATH_PROGRAM . 'V_common/');

データベースのユーザー・パスワードが異なる

よくあることではないでしょうか?開発環境では安易に、rootのパスワード無しなんてことありませんか?
下記の例は、MySQLですが、他のデータベースをお使いの場合は適当に書き換えてください。

  // データベース
  define("C_DB_HOST", "localhost");   // ホストネーム
  define("C_DB_USER", "user");          // ユーザー名
  define("C_DB_PASS", "pass");         // パスワード
  define("C_DB_DBNAME", "dbname"); // データベース名

キャッシュ利用の有無(ETAG含む)

処理を早くするために、データベースから取得したデータをキャッシュファイルに保存し、データベースに変更がなければ次回以降はキャッシュファイルを利用するケースがあります。また、各種web api(webサービス)を利用している場合でも、規約で許可された時間内はキャッシュを利用するとで高速化が図れます。
ただ、開発環境でキャッシュが効いてしまうと、整形済みの(X)HTMLをキャッシュするケースなどではプログラム変更が画面に反映されなくなることもあります。
そこで、開発環境はキャッシュをOFFにして、本番環境だけキャッシュをONにすると良いでしょう。

  // キャッシュ
  define("C_ETAG_ON", false);  // ブラウザキャッシュ(Etag)
  define("C_FILE_CAHCE_ON", false);  // ファイルキャッシュ
  define("C_CACHE_EXPIRE_XXX", 86400);  // 有効期限(単位:秒)
  define("C_CACHE_EXPIRE_YYY", 86400);  // 有効期限(単位:秒)
  // ※ ↑ XXX, YYYには、目的に応じて分かりやすい名前を

ログの取得レベル / ログ関連

本ファイルの趣旨として、本来は末行のC_LOG_LEVELだけを定義するべきなのですが・・・。
C_LOG_LEVELで定義する値自身が定数となるため、ログ関連はまとめてここで定義します。

  // ログファイル
  define("C_LOG_FILE", C_PATH_CACHE . "log/log.txt");  // ログファイルパス
  define("C_LOG_MAXSIZE", 3145728);  // 1つのログファイルの最大サイズ(byte)
  define("C_LOG_ERROR", 4);   // error
  define("C_LOG_FATAL", 3);   // fatal
  define("C_LOG_INFO", 2);      // info
  define("C_LOG_WARNING", 1); // warning
  define("C_LOG_DEBUG", 0);    // debug
  define("C_LOG_LEVEL", C_LOG_DEBUG);  // C_LOG_MODE 以上を出力

アクセス制限など

アクセス制限を開発環境で有効にしてしまうと、開発者自身が閲覧できないケースがあり、開発に支障をきたすことがあります。本番環境でOFFにすることはありませんが、開発環境ではONとOFFを頻繁に切り替える必要があるかもしれません。

  // アクセス制限
  function Is_limit_to_access(){
    return true;  // 開発は常に許可、本番ではコメントアウト
    $ret = false;
    // ここでアクセス制限に関する処理
    return $ret;
  }
  // アクセス制限の処理内容によってはfunctionではなく
  // フラグだけ定義し、別途制限処理を用意する方法もある
  // define("C_ACCESS_LIMIT", false);

アクセス解析コード

ユーザーの動向を探るためにアクセス解析を利用していますか?google analyticsなど他社の解析サービスを利用するには、(X)HTML内に指定されたコードを仕込む必要があります。
でも、頻繁にリロードする開発用のページがカウントされても意味がありませんよね。開発環境ではそのコードは外しておくべきでしょう。
なお、ページ埋め込み形式でないアクセス解析であればここは不要になります。

  // アクセス解析
  // $OUTPUT_TYPE = 出力ページの種類(PC・携帯など)
  // $PAGE_CODE = 出力ページ固有のKeyが必要な解析サービス用
  function getAccessAnalizeCode($OUTPUT_TYPE, $PAGE_CODE = ""){
    return "";  // アクセス解析を使用しない(本番環境ではコメントアウト)
    $ret = '';
    if ($OUTPUT_TYPE == C_PC){
      $ret = <<<END_TEXT
      <script type="text/javascript">
      // アクセス解析サービスから提供されたコード
      // var site_id = hoge_$PAGE_CODE
      </script>
END_TEXT;
    } else if ($OUTPUT_TYPE == C_MOBILE){
      $ret = <<<END_TEXT
      <script type="text/javascript">
      // アクセス解析サービスから提供されたコード
      </script>
END_TEXT;
    }
    return $ret;
  }

広告