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

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

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

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

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

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

出力メディア

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

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

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

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

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

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

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

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

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

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

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

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

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

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

アクセス制限など

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

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

アクセス解析コード

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

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