我在项目中使用 PHP 的 PDO 层进行数据访问,并且我一直在阅读它并发现它对持久数据库连接具有良好的固有支持。我想知道何时/是否应该使用它们。我会在大量 CRUD 的应用程序中看到性能优势吗?是否有需要考虑的缺点(可能与安全相关)?

如果这对你很重要,我正在使用 MySQL 5.x。

有帮助吗?

解决方案

您可以将其用作粗略的“规则集”:

是的, ,使用持久连接,如果:

  • 只有很少的应用程序/用户访问数据库,即您不会导致 200 个打开(但可能是空闲)连接,因为同一主机上共享 200 个不同的用户。
  • 数据库正在您通过网络访问的另一台服务器上运行
  • 一(一个)应用程序经常访问数据库

, ,如果出现以下情况,请勿使用持久连接:

  • 您的应用程序每小时只需访问数据库 100 次。
  • 您有许多网络服务器访问一台数据库服务器
  • 您正在 prefork 模式下使用 Apache。它为每个子进程使用一个连接,可以相当快地启动。(通过评论中的@Powerlord)

使用持久连接的速度要快得多,特别是当您通过网络访问数据库时。如果数据库运行在同一台机器上,差别不大,但还是快一点。然而 - 顾名思义 - 连接是持久的,即即使不使用,它也会保持打开状态。

问题是,在“默认配置”下,MySQL 只允许 1000 个并行“开放通道”。之后,新的连接将被拒绝(您可以调整此设置)。因此,如果您有 20 个 Web 服务器,每台服务器上有 100 个客户端,并且每个服务器每小时仅访问一页,简单的数学计算就会告诉您,您将需要 2000 个与数据库的并行连接。那是行不通的。

因此:仅将其用于有大量请求的应用程序。

其他提示

简而言之,我的经验表明应尽可能避免持久连接。

请注意,mysql_close 对于使用 mysql_pconnect 创建的连接来说是无操作(no-op)。这意味着客户端不能随意关闭持久连接。当连接上没有活动发生超过持续时间时,mysqldb 服务器将关闭此类连接 等待超时. 。如果 等待超时 值很大(比如 30 分钟),那么 mysql 数据库服务器可以轻松到达 最大连接数 限制。在这种情况下,mysql db将不会接受任何未来的连接请求。 这时您的寻呼机开始发出蜂鸣声。

为了避免达到 最大连接数 限制,使用持久连接需要仔细平衡以下变量......

  1. 一台主机上的apache进程数
  2. 运行 apache 的主机总数
  3. mysql 数据库服务器中的 wait_timout 变量
  4. mysql 数据库服务器中的 max_connections 变量
  5. 一个 apache 进程在重新生成之前所服务的请求数

所以,请深思熟虑后再使用持久连接。您可能不想为了从持久连接中获得的小收益而引发复杂的运行时问题。

创建与数据库的连接是一项相当昂贵的操作。持久连接是个好主意。在 ASP.Net 和 Java 世界中,我们有“连接池”,这大致是同一件事,也是一个好主意。

IMO,这个问题的真正答案是最适合您的应用程序。我建议您使用持久连接和非持久连接对您的应用程序进行基准测试。

玛吉·纳尔逊@ 客观导向 八月发布了有关此事的信息 罗伯特·斯沃索特 发表了一篇附文,其中包含一些硬数据。这两本都是相当不错的读物。

在我的愚见:

当使用 PHP 进行 Web 开发时,大部分连接只会在页面执行期间“存活”。持久连接将花费您大量的开销,因为您必须将其放入会话或类似的东西中。

99% 的情况下,在页面执行结束时终止的单个非持久连接将正常工作。

另外 1% 的时间,您可能不应该在应用程序中使用 PHP,并且没有适合您的完美解决方案。

我本来想问同样的问题,但我不会再次问同样的问题,而是添加一些我发现的信息。

还值得注意的是,较新的 mysqli 扩展甚至不包括使用持久数据库连接的选项。

我目前仍在使用持久连接,但计划在不久的将来切换到非持久连接。

一般来说,有时您需要使用非持久连接,并且最好将单一模式应用于数据库连接设计(只要在您的上下文中使用持久连接的好处相对较小。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top