スタッフブログ
mainfile.phpはXOOPSの設定ファイルで、XOOPSのパスやデータベースのアカウント情報などが書かれています。これらの設定情報は、当然 環境に依存しています。
開発フローを、開発→ステージング→プロダクションという流れでやる場合、同じサイトが少なくとも3つ以上できてしまいます。そうすると、mainfile.phpも複数できあがるわけです。ところが、XOOPS Cube Legacyはサイトプロフィールという概念がないため、mainfile.phpの取り扱いは悩ましいものがあります。(他のCMS、Drupalなどではあると聞いています。)
複数のmainfile.php問題を解決する方法はいくつか考えられます。
1. どの環境もそっくりの環境にする
XOOPS_ROOT_PATHなどはdirname(__FILE__)で解決し、データベースのアカウント情報はどのサーバでも共通のものにするという手法です。 ただ、この方法だとチームで開発に取り組む場合、あまりうまくいきません。SVNで管理しているサイトだと、お互いのmainfile.phpを上書きしあう心配があります。
2. mainfile.phpはSVNで管理しない
mainfile.phpは環境依存が強いため、SVNでは管理しないようにしておく方法があります。こうしておくと、チームでお互いのmainfile.phpを上書きする心配もありません。ところが、この方法では、リポジトリにmainfile.phpがないのが欠点になります。mainfile.phpが無いので、チェックアウトしてきても直ぐに動かせません。また、そのサイト全体で使われている定数をmainfile.phpに書いておくことがありますが、定数をいちいち手動で追加しなければなりません。(本来、環境依存ではない定数は、/settings/definition.phpに書くべきですが。)
そこで、今回紹介するのは、mainfile.phpをサイトごとに切り替える方法です。
まず、サイトごとのmainfile.phpを適当に名前を変更して、settingsの下に置きます。 例えば、今ローカル環境にあるmainfile.phpは開発環境なので、名前をmainfile.dev.phpに変えて、settingsに移動します。
. ├── mainfile.php ├── settings │ ├── mainfile.dev.php │ ├── mainfile.stag.php │ └── mainfile.prod.php (略)
次に、XOOPS_ROOT_PATHに空のmainfile.phpを作り、そこに下のコードをコピペします。
<?php
require XoopsProfiler::getProfile();
class XoopsProfiler
{
// ホスト名 => ファイル名
protected static $map = array(
'suinasia.local' => 'mainfile.dev.php', // 開発
'stag.suin.asia' => 'mainfile.stag.php', // ステージング
'suin.asia' => 'mainfile.prod.php', // プロダクション
);
public static function getProfile()
{
$xoopsRootPath = dirname(__FILE__);
$serverName = $_SERVER['SERVER_NAME'];
$ds = DIRECTORY_SEPARATOR;
if ( !isset(self::$map[$serverName]) )
{
trigger_error("Profile not found.");
die;
}
$mainfile = self::$map[$serverName];
$path = $xoopsRootPath.$ds.'settings'.$ds.$mainfile;
return $path;
}
}
あとは、$map配列のところを適宜書き換えるだけです。 配列のキーはホスト名で、値はそのホストで使うmainfile.phpになります。
上のコードを少し書き換えれば、開発環境でも複数のデータベースを簡単に切り替えたり、いろいろ応用できると思います。
トラックバック




