gpt4 book ai didi

php - 持久性 PDO mysql 连接替代方案

转载 作者:行者123 更新时间:2023-11-30 23:06:40 24 4
gpt4 key购买 nike

我目前通过 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 的持久数据库连接?

最佳答案

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

即使创建一个新的 MySQL 连接真的很便宜(与连接到 Oracle 或其他东西相比),您可能正在尝试减少这种开销。不过请记住,即使不这样做,大多数站点也能正常运行。这取决于您的流量有多大。此外,MySQL 5.6 和 5.7 使创建新连接的效率更高,因此升级后的开销已经更低。

您链接到的帖子中描述的风险是特定于 session 的状态没有被清除,因为给定的数据库连接被后续的 PHP 请求继承。

session 状态的例子包括:

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

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

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

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

关于php - 持久性 PDO mysql 连接替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21587485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com