如何使用PDO的持久连接?

时间:2010-11-13 08:13:46

标签: php mysql pdo

我有以下代码并在Firefox中刷新此网页5次,然后MySQL向我展示了5个连接。根据PDO手册,

  

永久连接未关闭   在脚本的末尾,但是   另一个脚本缓存并重新使用   请求使用相同的连接   证书。持久连接   缓存允许您避免开销   每个建立一个新的连接   脚本需要与a交谈的时间   数据库,导致更快的网络   应用

我使用了相同的凭据,但MYSQL连接的数量不断增加。即使尝试关闭与$db = null的连接也无法关闭连接。 我的代码出了什么问题?

<?php
try {
 $dbh = new PDO('mysql:host=127.0.0.1;dbname=lingtong', 'root', 'xxxxxx', array(PDO::ATTR_PERSISTENT => true));
 foreach ($dbh->query('SELECT * from agent') as $row) 
  print_r($row);
 $dbh = null;
} catch (PDOException $e) {
 print "Error! : " . $e->getMessage() . "<br/>";
 die();
}

3 个答案:

答案 0 :(得分:1)

据我所知,持久连接你可能不需要它:

  1. 你在本地主机上,所以连接非常快,你不会从连接缓存中节省很多费用
  2. 因为Apache的底层原则你有许多线程来回答客户端请求,并且由于这些多线程,连接在一个线程中是持久的,而不是在所有这些线程上共享,所以你会看到你的连接数量在mysql中,直到它到达apache的ThreadLimit
  3. 在dbLock或tableLock类型中,持久连接会导致应用程序出现问题。
  4. 现在,如果您仍然认为自己确实需要持续性连接,可能需要做更多的研究

答案 1 :(得分:1)

这个问题已经很久了,但如果我做出贡献就可以了。我认为你需要实现一个单例类来处理数据库连接我将在下面编写一个示例类。

<?php
class DB{

//set the connection property to private to prevent direct access 
private static $conn;

//now since we dont want to reinstiate the class anytime we need it, lets also set the constructor to private 
private function __construct(){}

//now lets create our method for connecting to the database 
public static function connect(){

//now lets check if a connection exists already in our $conn property, then we should return it instead of recreating a new connection 
if(!empty(self::$conn)){
return self::$conn;
}//end if 

//upon reaching here means the $conn property is empty so lets create a new connection 

try {
 $dbh = new PDO('mysql:host=127.0.0.1;dbname=lingtong', 'root', 'xxxxxx', array(PDO::ATTR_PERSISTENT => true));

//lets now assign the database connection to our $conn property 
self::$conn = $dbh;

//return the connection 
return $dbh;

} catch (PDOException $e) {
 print "Error! : " . $e->getMessage() . "<br/>";
 die();
}

}//end method 

}//end class

?>

我们的单例类只能创建一个连接并重用它,让我们看看如何使用我们的类

<?php 
$dbh = DB::connect();

foreach ($dbh->query('SELECT * from agent') as $row){ 
  print_r($row);
}
?>

答案 2 :(得分:1)

似乎你需要关闭游标并释放(赋值null)到最后一个pdo语句对象以及关闭连接。

此外,了解持久连接的重要之处在于它们仍然存在,但不保证您不会:

  • 在进一步的脚本执行中返回您的最后一个连接处理程序
  • 如果它仍然“忙碌”,也不会重复使用以前的连接。繁忙可能意味着在脚本,超时等...连接instanciation可能会继续...见Fully Understanding PDO ATTR_PERSISTENT