繁体   English   中英

连接池与持久连接mysqli

[英]Connection pooling vs persist connection mysqli

我读过mysqli介绍了mysql中没有的连接池。 http://php.net/manual/en/mysqli.quickstart.connections.php

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

Persistent connectionmysqli文档中,他们写道:

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

那么,mysqli是否使用连接池来实现持久连接?

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

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

实际上,术语连接池持久连接在PHP中的mysqli的情况下引用相同的东西。

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

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

您可能想知道为什么我们需要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连接池(以及任何其他连接池) 才能存在 池在以快速cgi模式工作时不起作用,或者在脚本执行后PHP可执行文件终止时以任何其他方式工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM