我目前通过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的持久数据库连接吗?
答案 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是无状态的,并且每次发出请求时都会重新初始化,因此在处理持久连接时,几乎没有任何优点和缺点(即突然断开连接,没有处理程序)。