PHP中的连接池

问题描述 投票:68回答:7

是否可以像使用J2EE容器一样在使用PHP时缓存数据库连接?如果是这样,怎么样?

php connection-pooling
7个回答
52
投票

php中没有连接池。 mysql_pconnect和连接池是两回事。与mysql_pconnect有很多问题,首先你应该阅读手册并仔细使用它,但这不是连接池。

连接池是应用程序服务器管理连接的一种技术。当应用程序需要连接时,它会向应用程序服务器询问它,如果有一个空闲,应用程序服务器将返回其中一个池连接。

我们可以在php中进行连接扩展,请通过以下链接:http://www.oracle.com/technetwork/articles/dsl/white-php-part1-355135.html

所以在PHP中没有连接池。

正如Julio所说,当请求结束当前请求时,apache会释放所有资源。您可以使用mysql_pconnect,但是您受限于该功能,您必须非常小心。其他选择是使用单例模式,但这些都不是汇集。

这是一篇很好的文章:https://blogs.oracle.com/opal/highly-scalable-connection-pooling-in-php

还读了这个http://www.apache2.es/2.2.2/mod/mod_dbd.html


13
投票

持久连接与连接池完全不同。只有在同一个请求/脚本执行上下文中进行多个数据库连接时,才会重用php中的持久连接。在大多数典型的Web开发方案中,如果使用mysql_pconnect,最大限度地提高连接速度,因为您的脚本将无法在下一个请求中获得对任何打开连接的引用。在php中使用db连接的最佳方法是创建db对象的单例实例,以便在脚本执行的上下文中重用连接。这仍然会导致每个请求至少连接1个db,但它比每个请求进行多个db连接更好。

由于php的性质,在PHP中没有真正的数据库连接池。 Php不是可以位于请求之间并管理对开放连接池的引用的应用程序服务器,至少在没有某种主要攻击的情况下。我认为理论上你可以在php中编写一个app服务器并将其作为一个命令行脚本运行,它只会在后台放置并保持一堆数据库连接打开并将对它们的引用传递给你的其他脚本,但我不知道知道在实践中是否可行,你如何将命令行脚本中的引用传递给其他脚本,我怀疑即使你可以将它拉出来也会表现良好。无论如何,这主要是猜测。我刚刚注意到其他人发布到apache模块的链接,以允许连接池为prefork服务器,如PHP。看起来很有趣:https://github.com/junamai2000/mod_namy_pool#readme


8
投票

我想你正在使用mod_php,对吧?

当一个PHP文件完成所有它的状态被杀死所以没有办法(在PHP代码中)进行连接池。相反,你必须依赖扩展。

您可以使用mysql_pconnect,以便在页面完成后不会关闭您的连接,这样它们就可以在下一个请求中重用。

这可能是您需要的所有内容,但这与连接池不同,因为无法指定要维护打开的连接数。

干杯。


6
投票

你可以使用MySQLi

有关详细信息,请向下滚动到连接池部分@ http://www.php.net/manual/en/mysqli.quickstart.connections.php#example-1622

请注意,连接池还取决于您的服务器(即Apache httpd)及其配置。


0
投票

您无法手动实例化连接池。

但是你可以使用mysql_pconnect函数的“内置”连接池。


0
投票

我想建议PDO::ATTR_PERSISTENT

持久连接是在脚本执行结束时不关闭的链接。当请求持久连接时,PHP检查是否已存在相同的持久连接(从前面开始保持打开状态) - 如果存在,则使用它。如果它不存在,则创建链接。


0
投票

连接池在MySQL服务器端工作,就像这样。

  1. 如果在MySQL服务器配置中启用了持久性连接,则在请求的客户端(php脚本)完成其工作并死亡后,MySQL会保持连接打开并处于睡眠状态。
  2. 当第二个请求带有相同的凭据数据(相同的用户名,相同的密码,相同的连接参数,相同的数据库名称,可能来自相同的IP,我不确定IP)然后MySQL将之前的连接从睡眠状态汇集到活动状态并让客户端使用连接。这有助于MySQL节省初始连接资源的时间并减少连接总数。

因此,连接池选项实际上可以在MySQL服务器端使用。在PHP代码结束时没有选项。 mysql_pconnect()只是一个包装器,通知PHP在脚本运行结束时不发送连接关闭请求信号。

© www.soinside.com 2019 - 2024. All rights reserved.