【问题标题】:make db connection persistent throught zend framework通过 zend 框架使数据库连接持久化
【发布时间】:2011-11-24 01:42:52
【问题描述】:

我正在使用 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,我应该使用什么方法来保存它(全局变量?),以及我应该在哪个文件中关闭连接?

【问题讨论】:

  • 如果您的应用程序使用默认的 ZF 结构,那么@erickthered 的答案是正确的。如果您仅在非 ZF 项目中使用 Zend_Db,请参阅:stackoverflow.com/questions/4840941/…
  • @DavidWeinraub 我完全同意。我基本上是在尝试模仿他似乎想要的风格。我个人实际上并没有使用我在回答中描述的方法,但它适用于那些打算在他们的项目中仅使用 Zend_Db 的人,而独立于框架的其余部分。您在链接的答案中描述的方式是,如果我不使用 erickthered 的方法(这是我实际使用的),我可能会怎么做。

标签: php mysql database zend-framework


【解决方案1】:

如果您使用默认项目结构(包括应用程序、库、测试和公用文件夹),您应该使用在 application/configs/application.ini 中设置 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 框架将自动打开和关闭与数据库的连接,您可以使用 Zend_Db_Table 或 Zend_Db_Table_Abstract 类轻松查询您的表,例如,检索给定 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();
    }
}

如您所见,无需打开/关闭连接,您将获得一个包含学生记录的字段和值的关联数组。

【讨论】:

    【解决方案2】:

    最好的办法可能是将所有数据库连接代码移动到单独的class 中,您可以在其中设置static $db var。

    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() 方法显式关闭底层数据库连接。

    【讨论】:

    • 关闭连接怎么样?
    • 它会自动关闭而无需我做任何事情?
    • @RafaelMoni 完成后关闭连接。例如。 1.打开连接。 2.运行查询。 3. 得到结果。 4. 关闭连接。
    • 我就是这么做的!不管怎么说,还是要谢谢你! :)
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 2022-12-13
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    相关资源
    最近更新 更多