相比之前我發過的第一種在zend framework2中實現多數據庫配置使用的方法:http://blog.csdn.net/a437629292/article/details/41121455;我更喜歡一下這種方法!
別急,聽我慢慢道來。
1. 問題:第一種方法(參見上述連接),是沒實例化一個model,都去實例化一個數據庫適配器,這樣是不是有點浪費資源呢?
所以,本人一直不滿意這種實現方式,一直在尋找如何能一個請求(無論包含多少個model的調用),甚至從項目啟動後,就只實例化一次數據庫適配器。
2. 想法:pubilc/index.php 是唯一入口文件,那就是說所有請求都需要經過index.php,那麼就有一點靈感了,是不是我在index.php裡實例化一個數據庫適配器數組,
然後根據配置或者是參數,去選擇實例化哪個數據庫適配器?
3. 實踐:既然有了這個想法,趕緊實踐一把:
在index.php裡加入如下代碼:
//實例化所有的數據庫適配器 $configs=new Zend_Config_Ini(APPLICATION_PATH.'/configs/serverConfig.ini'); $dbAdapters = array(); //$configArray = array(); $registry=Zend_Registry::getInstance(); foreach ($configs as $config){ $databaseName = $config->db->params->dbname; $registry=Zend_Registry::getInstance(); $configArray[$databaseName] = $config; $registry->set('configArray',$configArray); //配置數據庫 $db=Zend_Db::factory($config->db); //實例化一個合適的數據庫適配器 $db->query("set names utf8"); $dbAdapters[$databaseName] = $db; $dbAdapters[$databaseName] = Zend_Db::factory($config->db->adapter,$config->db->params->toArray()); if(($config->db->params->default) == 1){ Zend_Db_Table::setDefaultAdapter($db); } } $registry->set('dbAdapters', $dbAdapters);這樣,就會把serverConfig.ini裡的所有配置數據庫節點都實例化成數據庫適配器,並裝入數組中,在數組中了,我們就可以使用了。
我現在實現的是,設置默認的數據庫適配器,serverConfig.ini裡的代碼如下:
[proManager] db.adapter = PDO_MYSQL db.params.host = 127.0.0.1:3306 db.params.username = root db.params.password = root db.params.dbname = proManager db.params.default = 0 [proManager1] db.adapter = PDO_MYSQL db.params.host = 127.0.0.1:3306 db.params.username = root db.params.password = root db.params.dbname = proManager1 db.params.default = 1
國際慣例:歡迎拍磚!