Php 通过zend框架使数据库连接持久化

Php 通过zend框架使数据库连接持久化,php,mysql,database,zend-framework,Php,Mysql,Database,Zend Framework,我正在使用zend框架。目前,每次我需要使用数据库时,我都会继续并连接到数据库: function connect() { $connParams = array( "host" => $host, "port" => $port, "username" => $username, "password" => $password, "dbname" => $dbna

我正在使用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
}
所以每次需要使用db时,我都会调用connect()函数

我的问题是…假设我想在我的站点的任何地方重用$db,并且在站点加载的初始阶段只连接一次,然后在站点发送给用户之前关闭连接,那么实现这一点的最佳实践是什么


我应该在Zend中的哪个文件中保存$db,我应该使用什么方法保存它(全局变量?),我应该在哪个文件中关闭连接?

最好的方法是将所有db连接代码移动到一个单独的
类中,在该类中可以设置
静态$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服务器的容量。可以使用适配器的closeConnection()方法显式关闭基础数据库连接


如果使用默认项目结构(应用程序、库、测试和公用文件夹),则应使用application/configs/application.ini中的setup-up-db参数

示例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_表或zend_Db_表抽象类轻松查询您的表,例如,要检索给定SSN的学生数据,您可以编写一个如下所示的模型(application/models/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();
    }
}

关闭连接怎么样?它会自动关闭,而我什么也不做?@RafaelMoni完成后就关闭连接。例1。打开连接。2.运行查询。3.得到结果。4.密切联系,我就是这么做的!无论如何,谢谢!:)如果你的应用程序使用默认的ZF结构,那么@erickthered的答案就是正确的。如果您仅在非ZF项目中使用
Zend_Db
,请参阅:@DavidWeinraub我完全同意。我基本上是在模仿他想要的风格。我个人实际上并没有使用我在回答中描述的方法,但对于那些只打算在项目中使用
Zend_Db
而不依赖于框架其余部分的人来说,这是可行的。你在你链接的答案中描述的方式是,如果我不使用erickthered的方法(这就是我实际使用的方法),我可能会怎么做。