Php 通过zend框架使数据库连接持久化
我正在使用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
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的方法(这就是我实际使用的方法),我可能会怎么做。