持久的PDO mysql连接替代方案

时间:2014-02-05 20:13:13

标签: php mysql sql database pdo

我目前通过PDO为我的网站创建数据库连接,如下所示:

try {
    self::$dbh = new PDO("mysql:host={$host};dbname={$dbName}", $dbUser, $dbPass);
    self::$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING );
} 
catch (PDOException $e) {
    return $e->getMessage();
}

我一直在阅读有关持久连接的内容,所以我想添加持久性标志,如下所示:

self::$dbh = new PDO("mysql:host={$host};dbname={$dbName}", $dbUser, $dbPass,
    array(PDO::ATTR_PERSISTENT => true      
));

从我一直reading这可能是危险的,如果在查询等中发生某些事情。听起来这不是一个真正推荐的方法。

还有其他方法可以维持与MySQL的持久数据库连接吗?

2 个答案:

答案 0 :(得分:2)

使用持久连接的原因是每秒有大量的PHP请求,并且绝对需要每个最后一小部分性能。

即使创建一个新的MySQL连接真的相当便宜(与连接Oracle或其他东西相比),你可能会试图减少这种开销。但请记住,大多数网站在没有这样做的情况下相处得很好。这取决于您的流量有多重。此外,MySQL 5.6和5.7使创建新连接的效率更高,因此如果升级,开销就会降低。

您链接的帖子中描述的风险是,由于后续PHP请求继承了给定的数据库连接,因此特定于会话的状态未得到清理。

会话状态示例包括:

  • 未完成的交易
  • 临时表
  • 用户变量
  • 连接字符集

这甚至可能是一个安全问题,例如,如果一个PHP用户使用特权信息填充临时表,然后另一个PHP用户发现他们可以读取它。

幸运的是,在@Charles回答后的4年里, mysqlnd 驱动程序解决了这个问题。它现在使用mysql_change_user(),它类似于“软断开”,它重置所有会话状态细节,但不释放套接字。因此,您可以获得持久连接的好处,而不会有从一个PHP请求泄漏会话状态到另一个PHP请求的风险。见http://www.php.net/manual/en/mysqlnd.persist.php

这需要启用mysqlnd驱动程序,如果您使用任何合理的最新版本的PHP,它应该是。

答案 1 :(得分:-2)

为什么需要持久连接? PHP是无状态的,并且每次发出请求时都会重新初始化,因此在处理持久连接时,几乎没有任何优点和缺点(即突然断开连接,没有处理程序)。