用更好的設定檔來處理不同的網站
這次要來介紹的是關於我自己在 處理多個網站,使用不同的設定檔
的處理方式。
優點
- 減少FTP上傳的時候不小心覆蓋線上設定檔的問題。
- 各網站參數統一,不會發生有各自自訂參數的問題,且一定有預設值。
- 共用的Config方法可以只寫一次,不必一直複製與修改。
先來看看一般網站的設定檔是怎麼處理的
這裡指的設定檔是甚麼?
設定檔通常是全域的,並且在程式中統一使用。
// 從Config設定檔中取得資料庫的物件,然後使用
$db = Config::GetConnection();
$db->Sql("SELECT * FROM `table_name`")
常見的設定檔用法
因為不同網站的資料庫帳密、設定值是不同的,所以通常我們會寫Config1.php,Config2.php ..。
Config1.php
class Config {
//資料庫各項連線設定
public static $DbName = "1";
public static $DbHost = "1";
public static $DbPort = "1";
public static $DbUser = "1";
public static $DbPassword = "1";
public static $EnablePHPErrorReport = false;
public static function GetConnection() {
$host = \Config::$DbHost;
$name = \Config::$DbName;
$username = \Config::$DbUser;
$password = \Config::$DbPassword;
$db = new \Lib\MySqlDb($host, $username, $password, $name);
return $db;
}
}
Config2.php
class Config {
//資料庫各項連線設定
public static $DbName = "2";
public static $DbHost = "2";
public static $DbPort = "2";
public static $DbUser = "2";
public static $DbPassword = "2";
public static $EnablePHPErrorReport = false;
public static function GetConnection() {
$host = \Config::$DbHost;
$name = \Config::$DbName;
$username = \Config::$DbUser;
$password = \Config::$DbPassword;
$db = new \Lib\MySqlDb($host, $username, $password, $name);
return $db;
}
}
透過FTP上傳並改名為Config.php,這樣一來程式裡都可以統一用上面的方式使用Config,並且每個網站可以有不同的設定值。
缺點
- 再改名Config的過程中很容易傳錯或蓋錯檔案。
- 每當增加一筆屬性或設定或方法,就必須在每一隻都添加對應的程式。
- 再經過時間的洗禮,每隻Config.php的內容差異越來越大。
另一種方法是用程式來賦予值
class Config {
//資料庫各項連線設定
public static $DbName = "2";
public static $DbHost = "2";
public static $DbPort = "2";
public static $DbUser = "2";
public static $DbPassword = "2";
public static $EnablePHPErrorReport = false;
public static function GetConnection() {
$host = \Config::$DbHost;
$name = \Config::$DbName;
$username = \Config::$DbUser;
$password = \Config::$DbPassword;
$db = new \Lib\MySqlDb($host, $username, $password, $name);
return $db;
}
}
if ($sitename == 'website1') {
Config::$DbName = 'web1';
// ...
} else if ($sitename == 'website2') {
Config::$DbName = 'web2';
// ...
}
一樣可以達到同一隻Config.php但是不同設定
缺點
- 當網站越來越多,這隻檔案也就會越來越長。
- 因為沒有以檔案做區分,提升了寫錯地方的可能性。
我工作中正在使用的設定檔方法
檔案會比較多,但很好的避免了上述幾種的缺點,這是我目前正在用的。
概念:
每個網站上會有兩隻檔案,並且有自己對應的功能與屬性。
- Config.php 所有方法都在這裡。 所有可以用的屬性都在這裡。
- IdentifyConfig.php 僅僅放置這個網站獨有的設定,並且會覆蓋內容至class Config中。 Config中不存在屬性是不會填入Config中的
使用方法:
- 程式中一樣是
$db = Config::GetConnection();
- 引用的方式呢,一樣是直接引用Config.php,或者使用Autoload也行。
- FTP 上傳的時候也不怕Config直接覆蓋上去,要注意的僅僅是IdentifyConfig.php的覆蓋(因為檔名不同的關係,不小心直接上傳也不會影響到正在運行的網站)。
實作
Config.php 這個設定檔決定了寫程式的時候可以用甚麼屬性,與其預設值。
/**
* 將另一個 Class 的屬性設定到指定的 Class 裡面,若是指定的 Class 沒有該屬性則不會設定。
*
* @param string $config_name 要被設定的Class名稱
* @param string $identify_config_name Class設定檔的名稱
* @return void
*/
function LoadClassConfig($config_name, $identify_config_name) {
$identify_config = new ReflectionClass($identify_config_name);
foreach ($identify_config->getStaticProperties() as $name => $value) {
if (property_exists($config_name, $name)) {
$config_name::$$name = $value;
}
}
}
class Config {
//資料庫各項連線設定
public static $DbName = "def";
public static $DbHost = "def";
public static $DbPort = "def";
public static $DbUser = "def";
public static $DbPassword = "def";
public static $EnablePHPErrorReport = false;
public static $will_not_set = "不會被覆寫,依然可以使用";
public static function GetConnection() {
$host = \Config::$DbHost;
$name = \Config::$DbName;
$username = \Config::$DbUser;
$password = \Config::$DbPassword;
$db = new \Lib\MySqlDb($host, $username, $password, $name);
return $db;
}
public static Init() {
LoadClassConfig('Config', 'IdentifyConfig');
}
}
Config::Init();
IdentifyConfigBrand1.php
class IdentifyConfig {
//資料庫各項連線設定
public static $DbName = "1";
public static $DbHost = "1";
public static $DbPort = "1";
public static $DbUser = "1";
public static $DbPassword = "1";
public static $EnablePHPErrorReport = false;
}
IdentifyConfigBrand2.php
class IdentifyConfig {
//資料庫各項連線設定
public static $DbName = "2";
public static $DbHost = "2";
public static $DbPort = "2";
public static $DbUser = "2";
public static $DbPassword = "2";
public static $EnablePHPErrorReport = true;
}
你的留言可以讓文章更完整,更好!
留言
張貼留言