概要

FuelPHPは、テスト環境・ステージング環境・本番環境の各環境で、
異なるconfigファイルを読み込む仕組みになっています。
フレームワークとしてこれらが用意されているというのはありがたい。
接続先DBや、外部サーバとの接続情報などの設定をここに書くと使いやすいです。

各環境をどうやって見分けているかというと、
Apacheの環境変数にどの環境か(どのファイルを読み込むか)を設定します。
インストール後に、
SetEnv FUEL_ENV productionSetEnv FUEL_ENV develop
など各環境の .htaccess に追記しろ、という運用です。

.htaccessを通って、FuelPHPのフレームワークを動かす段階で環境変数が設定されるわけですが、
つまりはHTTPアクセスでないと環境変数を設定できません。
今回は、oilコマンドでバッチ実行する場合、環境変数はどうすべきかの考察です。

バッチ実行時の環境変数

fuel/app/bootstrap.php の記述を見てみると、

Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

環境変数が未設定の場合は、DEVELOPMENTつまり開発環境扱いとなります。
これにより、バッチ実行時は開発環境用のconfigファイルが選択されます。なんと迷惑な。

対処法

公式曰く

FuelPHPのサイトでは、env コマンドで変数を設定しろ とあります。
折角、各環境で分ける事が出来る環境変数を、
バッチ使うなら自分で環境の指定しろって実装はちょっと美しくないなー。

なんとかしたい

結局はソースコードで環境変数を管理するのが最も管理が楽。
.htaccessに書いているSetEnv FUEL_ENV develop は、$_SERVER['FUEL_ENV'] = 'develop';と同義なので、
Windows環境で実行されていたらlocalhostの環境変数を設定する、
という実装(下記のような感じ)でもなんとかなります。

if (substr(PHP_OS, 0, 3) == 'WIN')
{
    //
    // Eclipse での実行
    //
    $_SERVER['FUEL_ENV'] = 'localhost';
}
Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT);

実際は php_uname() で、OSやホスト名で分けて書いていく感じかなーと思いつつ、
ベストプラクティスでは気もします。何かあるかなー。

元記事はこちら

FuelPHPバッチ実行時の環境変数のTIPS