用更好的設定檔來處理不同的網站

LOGO.jpg



這次要來介紹的是關於我自己在 處理多個網站,使用不同的設定檔 的處理方式。



優點




  • 減少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但是不同設定



缺點




  • 當網站越來越多,這隻檔案也就會越來越長。

  • 因為沒有以檔案做區分,提升了寫錯地方的可能性。



我工作中正在使用的設定檔方法



檔案會比較多,但很好的避免了上述幾種的缺點,這是我目前正在用的。



概念:



每個網站上會有兩隻檔案,並且有自己對應的功能與屬性。




  1. Config.php 所有方法都在這裡。 所有可以用的屬性都在這裡。

  2. 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;
}


你的留言可以讓文章更完整,更好!



留言

這個網誌中的熱門文章

成人剪舌繫帶聽過嗎?我剪了!!

關於RCA

Scp - ssh 的遠端檔案傳輸指令