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