2012-03-14 125 views
1

從本地主機開發環境部署到暫存服務器後,我們在我們的網站中發現了錯誤。 我們縮小了錯誤降低到下面的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']解析爲 '本地主機' - 注意我們需要添加我們的網站文件夾名稱,就像我在上面的示例#1中所示。 I.E.在我們的本地主機上,$ _SERVER ['HTTP_HOST']是不知道其中涉及的網站文件夾 - 我們必須附加它。

  • ,但我們的臨時服務器上,$ _ SERVER [ 'HTTP_HOST']解析爲 'www.ourWebSite.com'。 在這種情況下,我們不需要追加任何東西 - 登臺Web服務器返回我們的網站文件夾。

有我們認爲一對夫婦的缺憾不雅「卑鄙-言論功能於代碼審查」的解決方法。是。

但我想有更好的方法 - 任何想法?

+0

您是否使用apache作爲網絡服務器?在任何情況下,如果兩臺主機都有相同的文檔,你就不會遇到這個問題。 – kclair 2012-03-14 20:36:53

+0

是的,Apache和PHP版本5都在本地和分段服務器上。 – wantTheBest 2012-03-14 20:37:55

回答

3

配置文件是正確的答案..我使用默認和覆蓋設置。 在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

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

然後在生產中,我只是刪除dev-config文件。超級簡單,完美無瑕。

如果你想保持它的方式,這也可以通過你的開發盒上的http.conf調整來解決。您需要將您的documentRoot設置爲現在的狀態,加上/ ourWebSite的http://localhost/將指向您的代碼中的相同文件夾http://production.url/

+0

這是光滑的。我非常喜歡dev-config.php在訓練車輪不需要時從橋上拋下的方式,很好。儘管我現在正在做第二個建議,雖然它比編碼更管理,但它是乾淨的,意味着開發和生產環境沒有區別 - 謝謝! – wantTheBest 2012-03-14 20:55:40

+1

n/p - 我很確定我從幾年前的某個地方拿起了這個想法,所以只適合分享回去:) – whiteatom 2012-03-14 21:08:31

4

一個選項是有一個配置文件,根據它所在的主機(通常基於APPLICATION_ENV),可以正確拉取。 Zend Framework通過在apache配置中加載.ini文件對應的APPLICATION_ENV的正確部分來實現。你可以使用一個PHP文件與數組或其他任何東西,真的。您需要做的就是將APPLICATION_ENV設置爲暫存/生產中的一件事情,但在開發服務器上有所不同。

一個簡單的例子:

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

我們開始沿着這條路走下去,並且有一個「差異」類型的配置文件,但有些人開始使用/維護它,並且它被刪除了。好的建議,但。 – wantTheBest 2012-03-14 20:40:15

+0

這絕對是或者類似的方式,只有一個配置文件,但添加像$ config ['paths'] ['dev'] ['homepath']'和'$ config ['路徑'] ['staging'] ['homepath']'等,然後使用'$ config ['paths'] [APPLICATION_ENV] ['homepath']' – scibuff 2012-03-14 20:46:30

3

function get_homepath(){ 

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

    return $host . '/'; 

} 
+0

+1,這將工作,謝謝。希望儘管避免它,但如果沒有更優雅的方式,我在那裏的人,因爲它解決了這個問題。我希望有一個很酷的方式來解決它,我們不知道。 – wantTheBest 2012-03-14 20:47:52

3

通常人們是如何設置不同的環境設置取決於如果它的開發環境或生產環境。正如您發現的那樣,這樣做的原因是輕鬆地將代碼從開發轉移到生產。

不是直接在URL中插入$ _SERVER變量,而是設置一個條件來檢查$ _SERVER ['HTTP_HOST'],找出我們的環境,並注入一個不同的變量來保存腳本的實際路徑。

相關問題