2011-11-24 84 views
1

我正在使用zend框架。目前,每次我需要使用DB我繼續前進,連接到數據庫:使數據庫連接在zend框架中持久化

function connect() 
{ 
    $connParams = array(
     "host" => $host, 
     "port" => $port, 
     "username" => $username, 
     "password" => $password, 
     "dbname" => $dbname 
    ); 

    $db = new Zend_Db_Adapter_Pdo_Mysql($connParams); 
    return $db 
} 

,所以我只是調用connect()函數,每次我需要使用DB

我的問題是.. 。假設我想在我的站點的任何地方重複使用$ db,並且只在站點加載的最初階段連接一次,然後在站點發送給用戶之前關閉連接,那麼完成此操作的最佳實踐是什麼?

Zend中的哪個文件應該保存$ db,我應該使用什麼方法保存它(全局變量?)以及哪個文件應該關閉連接?

+0

如果您的應用程序使用默認的ZF結構,那麼@erickthered的答案就是正確的。如果您只在其他非ZF項目中使用'Zend_Db',請參閱:http://stackoverflow.com/questions/4840941/zend-db-without-zend-framework/4841608#4841608 –

+0

@DavidWeinraub我完全同意。我基本上試圖模仿這種風格,因爲它看起來像他要去的。我個人實際上並沒有使用我在我的回答中描述的方法,但它適用於那些打算在他們的項目中僅使用'Zend_Db'的人,而與框架的其餘部分無關。你在與你相關的答案中描述的方式是,如果我不使用erickthered的方法(這是我實際使用的方法),我可能會這樣做。 –

回答

1

您最好的辦法可能是將您的所有db連接代碼移動到單獨的class中,您可以在其中設置static $db變量。

protected static $_db; 

public static function connect() 
{ 
    if (self::$_db == null) { 
     $config = Zend_Config_Xml(); // whatever you'd use 

     self::$_db = Zend_Db::factory($config->database); 
     self::$_db->setFetchMode(Zend_Db::FETCH_OBJ); 
     self::$_db->query('SET NAMES UTF8'); 

     Zend_Db_Table::setDefaultAdapter(self::$_db); // optional 
    } 

    return self::$_db; 
} 

public static function close() 
{ 
    if (self::$_db != null) { 
     self::$_db->closeConnection(); 
    } 
} 

據Zend公司:

一般而言,這是沒有必要關閉數據庫連接。 PHP會自動清理所有資源並請求結束。數據庫擴展旨在關閉連接,因爲對資源對象的引用已清理完畢。

但是,如果您有一個長時間的PHP腳本啓動多個數據庫連接,則可能需要關閉連接,以避免耗盡RDBMS服務器的容量。您可以使用Adapter的closeConnection()方法顯式關閉底層數據庫連接。

+0

關閉連接怎麼樣? –

+0

Zend應該處理這個問題。 –

+0

它會自動關閉,無需我做任何事情? –

2

如果您使用的是默認的項目結構(與應用程序,庫,測試和公共文件夾),你應該使用設置在應用/ CONFIGS數據庫參數/的application.ini

例的application.ini:

[production] 
resources.db.adapter = "pdo_mysql" 
resources.db.params.host = "localhost" 
resources.db.params.username = "testuser" 
resources.db.params.dbname = "testdb" 
resources.db.params.password = "testpasswd" 
resources.db.isDefaultTableAdapter = true 

這樣的Zend Framework將自動打開和關閉連接到數據庫,並且可以使用Zend_Db_Table類或Zend_Db_Table_Abstract類方便地查詢你的表格,例如,retrie五個學生的數據對於一個給定SSN你可以寫一個模型(應用程序/模型/ Student.php),看起來是這樣的:

<?php 
class Model_Student extends Zend_Db_Table_Abstract 
{ 
    protected $_name = "student"; 

    public function fetchRowsBySSN($ssn) 
    { 
     $select = $this->select(); 
     $select->where('ssn = ?', $ssn); 

     return $this->fetchRow($select)->toArray(); 
    } 
} 

正如你可以看到有沒有必要打開/關閉連接並且您將得到一個包含學生記錄字段和值的關聯數組。