9

次の関数を使用して、内部のマシン上にあるかライブ サーバー上にあるかを自動検出し、さまざまなコンポーネントに適した構成を選択します。

function devIsLocal(){

    $res=false;

    $http_host=$_SERVER['HTTP_HOST'];

    if($http_host=='localhost')$res=true;
    if($http_host=='127.0.0.1')$res=true;
    if(substr($http_host,-4)=='.lan')$res=true;
    if(strpos($http_host, '.')===false)$res=true;

    return($res);

}

ご覧のとおり、HTTP_HOST 値のみに依存しています。

もちろん、example.com のような何らかの仮想ホストをローカルで使用すると、関数はだまされます。

関数をだます他の方法はありますか?また、自分がどこにいるのかを判断するために、他にどのような変数/場所をのぞくことができますか?

4

5 に答える 5

16

Apache 仮想ホスト構成で環境変数を設定します。これが Zend Framework のやり方です。

例については、 ZF クイック スタート ガイドを参照してください(「仮想ホストの作成」セクション)。

httpd.conf または .htaccess ファイルに次のように記述します。

SetEnv APPLICATION_ENV "development"

次に、アプリケーションでgetenv関数を使用して値を取得します。

$environment = getenv("APPLICATION_ENV");
if ($environment == "development")
{
    // do development stuff
}
else if ($environment == "live")
{
    // do live stuff
}
于 2010-04-09T12:06:20.657 に答える
12
'127.0.0.1' == $_SERVER["REMOTE_ADDR"]

これは、実際のシステムと同じように評価されることはありませんTRUE。:)

于 2010-04-09T12:11:58.010 に答える
3

アンディシェラムの答えに追加..

mod_vhost_aliasを使用している場合、または同じ(仮想)ドキュメントルートを持つさまざまなドメインがある場合は、パラメーターに応じて変数を設定できます。

SetEnvIf SERVER_ADDR x.x.x.x APPLICATION_ENV=development
SetEnvIf HTTP_HOST abc.example.com APPLICATION_ENV=development
于 2010-04-09T12:33:28.430 に答える
1

ライブ サーバーのファイル システムにのみ存在するファイルを作成し、後で検索します。

確かに、環境は可能な限り類似している必要があります。私が提案しているのは次のようなものです: ディレクトリ /var/environment/ に、使用しているサーバーに応じて {devel|test|qa|staging|live} という名前のファイルを作成し、ファイル名を確認します。

もちろん、このファイルをバージョン管理やビルド プロセスから除外する必要があります。

于 2010-04-09T11:58:55.913 に答える
0

もちろん、example.com のようにローカルで仮想ホストを使用している場合、関数はだまされます。

また、ホストがローカルではなく、widlcard またはデフォルトの vhost defn を使用し、ユーザーがホスト ファイルにローカルで IP アドレスを追加する場合。

インクルード パス上にディレクトリを作成することをお勧めします。このディレクトリはライブでも存在しますが、そこには複製されず、単純に保存されます。

function getEnv(){
  return 'Live';
}

また

function getEnv(){
  return 'Test';
}

両方の env が同じサーバー上にある場合でも、Apache 構成または .htaccess で include_path を設定することでこれを行うことができます。

これにより、データベースのホスト/パスワードや暗号化キーなど、潜在的に機密性の高い環境固有のデータを分離することもできます。

C.

于 2010-04-09T11:59:45.507 に答える