10

我读过 mysqli 引入了 mysql 中不可用的连接池。 http://php.net/manual/en/mysqli.quickstart.connections.php

我读过这个问题,它解释了连接池和持久连接之间的区别。

mysqli 文档中,Persistent connection他们写道:

如果在连接池中找不到主机、用户名、密码、套接字、端口和默认数据库的给定组合的未使用持久连接,则 mysqli 会打开一个新连接。

那么,mysqli 是否将连接池用于持久连接?

如果是,那么mysqli中的连接池和持久连接有什么区别?

如果不是,那么 mysqli 如何为持久连接执行连接对象的查找?

4

2 回答 2

6

实际上,术语连接池持久连接在 PHP中的mysqli情况下指的是同一件事。

在这种情况下,持久连接是指从 PHP 脚本打开的 MySQL 连接,在脚本完成执行后保持打开状态,以便在以后的某些执行中再次使用。

连接池意味着有一个由 PHP 维护的持久连接池。来自这个池的一个空闲连接被提供给想要连接到 MySQL 的 PHP 脚本,并在脚本完成时返回到池中。

您可能想知道为什么我们需要 MySQL 连接池,为什么我们不对所有脚本只使用一个持久连接呢?

有两个原因:

  • PHP 创建一个基于host/port/username/password使用的 MySQL 连接池。如果一个脚本想要以某种host/port/username/password组合连接到 MySQL,PHP 会搜索具有相同值的空闲持久连接。如果未找到,则使用此host/port/username/password组合创建一个新的持久连接。因此,我们至少需要与host/port/username/password所有脚本使用的不同值一样多的不同持久连接。
  • 您不能同时在一个 MySQL 连接上执行两个 SQL 命令。当两个 PHP 脚本同时执行时,就会发生这种情况。当两个脚本要同时与 MySQL 通信时,会创建两个持久的 MySQL 连接。池中的持久连接数等于最后执行的最大并行 PHP 脚本数,或等于php.ini.

重要通知:

只有当 PHP 作为 Web 服务器插件执行时, MySQL 连接池(和任何其他连接池)才能存在。当 PHP 可执行文件在脚本执行后终止时,池在 fast-cgi 模式下或以任何其他方式工作时不起作用。

编辑:如果 Web 服务器配置为对多个请求重用一个 PHP fast-cgi 进程,则 MySQL 连接池可以在 PHP 的 fast-cgi 模式下使用。如果 PHP fast-cgi 进程配置为在服务一个请求后退出,那么它的所有 MySQL 连接都将关闭。

于 2016-03-22T22:39:39.800 回答
1

在 中libmysql18,它会查找任何现有的默认 mysqlsock/port并使用凭据对其进行测试。如果找不到,clone()则调用 c++ 函数,创建新的连接对象(资源)。在某些情况下,这可能会导致堆栈溢出。我不熟悉它在mysqlnd(本机驱动程序)中的工作方式。也许别人是。如果您想了解有关其工作原理的更多信息,请安装一个版本的 facebooksHHVM-debug包并尝试在多个嵌套函数中通过全局传递连接。这可能会在 HHVM 下触发堆栈溢出,这将显示在异常之前调用的每个函数。

于 2014-08-02T05:27:58.893 回答