连接池与持久连接mysqli的区别

11

我读到mysqli引入了连接池,而mysql中没有这个功能。详细内容请见http://php.net/manual/en/mysqli.quickstart.connections.php

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

mysqli的Persistent connection文档中,它们写道:

  

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

那么,mysqli是否在持久连接中使用连接池呢?

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

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

2个回答

7
实际上,在PHP中的mysqli情况下,“连接池”和“持久连接”这两个术语是指同一件事。
在这种情况下,“持久连接”指的是从PHP脚本打开的MySQL连接,即使脚本执行完毕后仍保持打开状态,以便在稍后的执行中再次使用。
“连接池”意味着由PHP维护一组持久连接。从该池中提供一个空闲连接给想要连接到MySQL的PHP脚本,并在脚本完成后返回到池中。
你可能会想为什么我们需要MySQL连接池,为什么不为所有脚本使用一个持久连接?
原因有两个:
1.PHP基于使用的“主机/端口/用户名/密码”创建MySQL连接池。如果一个脚本想要使用某个“主机/端口/用户名/密码”组合连接到MySQL,PHP会搜索具有相同值的空闲持久连接。如果没有找到,则使用此“主机/端口/用户名/密码”组合创建新的持久连接。因此,我们至少需要与所有脚本使用的不同“主机/端口/用户名/密码”值一样多的不同持久连接。
2.不能同时在一个MySQL连接上执行两个SQL命令。当两个PHP脚本同时执行时,就会出现这种情况。当两个脚本想要同时与MySQL通信时,就会创建两个持久的MySQL连接。池中持久连接的数量等于执行的最后一个最大并行PHP脚本数,或者等于在php.ini中设置的上限。
重要提示:
MySQL连接池(以及任何其他连接池)只能存在于PHP作为Web服务器插件运行的情况下。当以fast-cgi模式或任何其他方式工作时,当PHP可执行文件执行完毕后,池不起作用。
编辑:如果Web服务器配置为为多个请求重复使用一个PHP fast-cgi进程,则可以在PHP的fast-cgi模式下使用MySQL连接池。如果将PHP fast-cgi进程配置为在提供一个请求后退出,则关闭其所有MySQL连接。

1

libmysql18中,它会寻找现有的默认mysql sock/port,并使用凭据进行测试。如果找不到,将调用C++函数clone()来创建新的连接对象(资源)。在某些情况下,这可能会导致堆栈溢出。我不熟悉mysqlnd(原生驱动程序)的工作方式。也许其他人会知道。如果您想了解更多信息,请安装Facebook的HHVM-debug包的版本,并尝试通过全局传递连接以在多个嵌套功能中触发堆栈溢出。这可以在HHVM下触发堆栈溢出,从而向您显示异常之前调用的每个函数直到该点。


谢谢您的回复。 我正在寻找mysqli和php,而不是黑客技术。 - Dhruv Kapatel
@Dhruv 是的,我知道。PHP连接MySQL有两个不同的驱动程序。一个是mysqlnd,另一个是libmysql。你使用的驱动程序取决于你的操作系统和安装方式。我回答了你关于它如何执行连接对象查找的问题。 - r3wt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接