[英]How to change different configuration settings between environments in PHP?
我有一些通過AJAX調用的php文件。 它們都有指向我的config.php的URL。 現在,我遇到的問題是,當我在服務器上部署新版本時,總是必須手動將URL更改為該配置文件。
本地路徑:
define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/mywebsite');
服務器路徑:
define('__ROOT__', $_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/');
我想跟蹤所有這些PHP文件中的更改。 我正在尋找一種自動更改此路徑的解決方案。
例如,這是我當前的工作流程:
當地環境:
服務器:
您正在嘗試在開發和運行之間運行不同的代碼庫,不建議這樣做-它們應該相同。 我解決此問題的方法是使用環境變量來指定應加載幾個配置文件中的哪個。
在我的Apache vhost中,我執行以下操作:
SetEnv ENVIRONMENT_NAME local
然后,我使用一個函數來讀取環境名稱:
function getEnvironmentName()
{
$envKeyName = 'ENVIRONMENT_NAME';
$envName = isset($_SERVER[$envKeyName]) ? $_SERVER[$envKeyName] : null;
if (!$envName)
{
throw new \Exception('No environment name found, cannot proceed');
}
return $envName;
}
然后,可以在配置文件中使用該環境名稱以include
,或從鍵入環境的單個數組中檢索值。
我通常將特定於環境的設置保存在名為configs/
的文件夾中,但是您可以將其存儲在應用程序中任何有意義的位置。 因此,例如,您可以擁有以下文件:
// This is /configs/local.php
return array(
'path' => '/mywebsite',
// As many key-values as you want
);
然后,您可以執行此操作(假設前端控制器在項目中位於一個層次深處,例如/web/index.php
):
$root = dirname(__DIR__);
$config = include($root . '/configs/' . getEnvironmentName() . '.php');
然后,您可以在$config
訪問相應的每個環境設置。
達到此目的的純git方法將是filter 。 過濾器很酷,但經常被忽略。 將過濾器視為可以完全控制的git關鍵字擴展方式。
例如,文件的簽入版本將如下所示:
define('__ROOT__', 'MUST_BE_REPLACED_BY_SMUDGE');
然后設置兩個過濾器:
在本地計算機上,您將設置一個smudge
過濾器來替換
'MUST_BE_REPLACED_BY_SMUDGE'
同
$_SERVER["DOCUMENT_ROOT"].'/mywebsite'
在您的服務器上,您將設置一個smudge
過濾器來替換
'MUST_BE_REPLACED_BY_SMUDGE'
同
$_SERVER["DOCUMENT_ROOT"].'/../dev.my-website.tld/Modules/'
在兩台機器上, clean
過濾器都會將線路恢復為
define('__ROOT__', 'MUST_BE_REPLACED_BY_SMUDGE');
有關過濾器的更多信息,可以在此答案和Git Book中找到 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.