我读过mysqli介绍了mysql中没有的连接池。 http://php.net/manual/en/mysqli.quickstart.connections.php
我已阅读this question,解释了连接池和持久连接之间的区别。
他们在mysqli documentation for Persistent connection
写道:
如果给定的主机组合有未使用的持久连接, 无法找到用户名,密码,套接字,端口和默认数据库 在连接池中,然后mysqli打开一个新连接。
那么,mysqli是否使用连接池进行持久连接?</ p>
如果是,那么mysqli中的连接池和持久连接有什么区别?
如果不是,那么mysqli如何为持久连接执行连接对象的查找?
答案 0 :(得分:5)
在 mysqli的情况下,实际上 连接池 和 持久连接 的术语指的是同样的事情在PHP中。
持久连接 在这种情况下是指从PHP脚本打开的MySQL连接,该脚本在脚本执行完毕后保持打开状态,在以后的某些执行中再次使用。 / p>
连接池 意味着PHP维护了一个持久连接池。来自此池的一个空闲连接被提供给PHP脚本,该脚本想要连接到MySQL并在脚本完成时返回到池。
您可能想知道为什么我们需要MySQL连接池,为什么我们不为所有脚本只使用一个持久连接?</ em>
这有两个原因:
host/port/username/password
创建一个MySQL连接池。如果一个脚本想要使用某些host/port/username/password
组合连接到MySQL,PHP将搜索具有相同值的空闲持久连接。如果找不到,则使用此host/port/username/password
组合创建新的持久连接。因此,我们至少需要与所有脚本使用的host/port/username/password
值不同的持久连接数。php.ini
中设置的上限。重要提示:
MySQL连接池(以及任何其他连接池)只有在PHP作为Web服务器插件执行时才能存在。池在以快速cgi模式工作时不起作用,或者在脚本执行后PHP可执行文件终止时以任何其他方式工作。
编辑:如果将Web服务器配置为针对多个请求重用一个PHP fast-cgi进程,则可以在PHP的fast-cgi模式中使用MySQL连接池。如果PHP fast-cgi进程配置为在提供一个请求后退出,那么它的所有MySQL连接都将被关闭。
答案 1 :(得分:1)
在libmysql18
中,它查找任何现有的默认mysql sock/port
并使用凭据对其进行测试。如果找不到,则调用c ++函数clone()
,创建新的连接对象(Resource)。在某些情况下,这可能导致堆栈溢出。我不熟悉它在mysqlnd
(本机驱动程序)中的工作原理。也许别人是。如果您想了解有关其工作原理的更多信息,请安装一个版本的facebook HHVM-debug
包并尝试通过多个嵌套函数中的全局传递连接。这可以在HHVM下触发堆栈溢出,这将显示在该异常之前调用的每个函数。