2012-03-14 13 views
1

localhost開発環境からステージングサーバーに展開した後、私たちのサイトにバグが発見されました。 は、我々は次のPHPコードスニペットにバグを絞り込む:

 $_SERVER['HTTP_HOST'] 

私たちは、当社のウェブサイトで使用されるさまざまなファイルへのパスを構築するためにそれを使用します。例えば

:ここ

  // EXAMPLE #1 -- THIS WORKS ON OUR LOCAL MACHINE 
     $theSelectedImage = "http://" . $_SERVER['HTTP_HOST'] . "/ourWebSite/egyptVase.png"; 

     // EXAMPLE #2 --BUT IT MUST BE THIS TO WORK ON THE STAGING SERVER 
     $theSelectedImage = "http://" . $_SERVER['HTTP_HOST'] . "/egyptVase.png"; 

が問題の核心である:私達のローカルホストマシン、$ _SERVERに

  • [ 'HTTP_HOST']は 'localhostの' に解決 - 上記の例#1に示すように、Webサイトのフォルダ名を追加する必要があることに注意してください。 I.私たちのlocalhostマシンでは、$ _SERVER ['HTTP_HOST']はです。にはウェブサイトのフォルダが含まれています。追加する必要があります。

  • 私たちのステージングサーバー上で、$ _SERVER [ 'HTTP_HOST']は 'www.ourWebSite.com' に解決されます。 この場合、何も追加する必要はありません。ステージングWebサーバーはWebサイトのフォルダを返します。

私たちは、いくつかのクルージーな魅力的な「批判的なコードレビュー」の回避策を考えましたか?はい。

しかし、私はそこに良い方法があると思います - どんなアイデアですか?

+0

WebサーバーとしてApacheを使用していますか?いずれの場合でも、両方のホストが同じドキュメントルートを持っているようであれば、この問題は発生しません。 – kclair

+0

はい、ApacheとPHPのvers.5は、ローカルサーバーとステージングサーバーの両方にあります。 – wantTheBest

答えて

3

設定ファイルは正解です。私はデフォルトとオーバーライド設定を使用します。 DEV-Configでconfig.phpの中

$config = array('url' => 'http://production.url'); // 'conf1'=> 'var1', etc 
$dev_config = array(); 
@include_once('dev-config.php'); 
$config = array_merge($config, $dev_config); 

。あなたは$のdev_config

$dev_config['url'] = 'http://localhost/ourWebSite'; 

に任意の上書きを追加するPHPは、次に生産で、私はDEV-configファイルを削除します。超簡単、完璧に動作します。

あなたが持っている通りにしたい場合は、dev.confのhttp.confを使って解決することもできます。あなたのdocumentRootをこれまでのものに設定する必要があります。/ ourWebSite http://localhost/は、コード内に同じフォルダを指しますhttp://production.url/

+0

これは滑らかです。私はdev-config.phpが訓練用の車輪が必要でない時に橋から投げ出される方法が大好きです。今のところ私はコーディングより管理者でありながら、クリーンで開発者とプロダクション環境の間に違いはないという2番目の提案をしていますが、ありがとうございます! – wantTheBest

+1

n/p - 私は確かに私は何年か前にどこかでこのアイデアを拾ったと思います。 – whiteatom

4

1つのオプションは、それがどのホスト上にあるか(通常はAPPLICATION_ENVに基づいて)に応じて適切にプルする設定ファイルを持つことです。 Zend Frameworkは、.iniファイルの正しいセクションをApacheコンフィグでAPPLICATION_ENVにロードすることでこれを行います。実際には、配列などのPHPファイルを使用できます。あなたがする必要があるのは、APPLICATION_ENVをステージング/プロダクションではなく、devサーバで異なるものに設定することだけです。

簡単な例:

switch (APPLICATION_ENV) { 
    case 'dev': 
     define('APPLICATION_URL', $_SERVER['HTTP_HOST'] . '/ourWebSite'); 
     break; 
    case 'production': 
    case 'staging': 
     define('APPLICATION_URL', $_SERVER['HTTP_HOST']); 
     break; 
} 
+0

私たちはそのパスを開始し、設定ファイルの '相違'タイプを持っていましたが、使用/維持についてb_tchingを開始した人もいました。しかし、良い提案。 – wantTheBest

+0

これは間違いなく、あるいは同様の方法で、単一の設定ファイルを持ちますが、 '$ config ['paths'] ['dev'] ['homepath']'と '$ config [ '' homepage '' '' '$ config ['paths'] [APPLICATION_ENV] ['homepath']' – scibuff

3

について

通常
function get_homepath(){ 

    $host = $_SERVER['HTTP_HOST']; 
    if ($host == 'localhost'){ return $host . '/ourWebSite/'; } 

    return $host . '/'; 

} 
+0

+1、これはうまくいくでしょう。それを避けることを望んでいたが、それ以上のエレガントな方法がなければ、問題を解決するので、私はそこにいる。私たちが気づいていないことに気をつけて驚くほどクールな方法があることを期待していました。 – wantTheBest

3

人々がその場合は、開発環境や本番環境に応じて、異なる環境設定を設定する方法。この理由は、あなたが知ったように、開発から生産までコードを簡単に移動させるためです。

URLに直接$ _SERVER変数を挿入する代わりに、$ _SERVER ['HTTP_HOST']を確認し、私たちがどのような環境にあるかを調べ、スクリプトの実際のパスを保持する別の変数を挿入する条件を設定します。

関連する問題