PHP中的连接池

时间:2008-09-02 15:11:50

标签: php connection-pooling

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

8 个答案:

答案 0 :(得分:49)

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

答案 1 :(得分:11)

持久连接与连接池完全不同。只有在同一个请求/脚本执行上下文中进行多个数据库连接时,才会重用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

答案 2 :(得分:8)

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

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

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

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

干杯。

答案 3 :(得分:6)

您可以使用MySQLi

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

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

答案 4 :(得分:0)

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

但您可以使用“内置”连接池与mysql_pconnect功能。

答案 5 :(得分:0)

我想建议PDO::ATTR_PERSISTENT

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

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

如果在打开的连接池中未找到给定的“主机,用户名,密码,套接字,端口和默认数据库”组合的未使用持久连接,则只有mysqli会打开一个新连接,否则将重用已经打开的连接可用的持久连接,其方式类似于连接池的概念。可以使用PHP指令mysqli.allow_persistent启用和禁用持久性连接。可以通过mysqli.max_links限制脚本打开的连接总数(这可能对您解决max_user_connections达到托管服务器限制的问题很感兴趣)。可以使用mysqli.max_persistent限制每个PHP进程的最大持久连接数。

在更广泛的编程环境中,这是Web /应用服务器的任务,但是在这种情况下,它由PHP本身的mysqli指令以支持连接可重用性的方式进行处理。您还可以实现单例类,以获取静态的连接实例以重用,就像在Java中一样。只是要提醒一下,java作为标准JDBC的一部分也不支持连接池,它们是JDBC驱动程序之上的不同模块/层。

来到PHP的好处是,对于PHP echo系统中的通用数据库,它确实支持Persistent Database Connections,该持久性数据库连接可保留500个请求的连接(php.ini中max_requests的配置),并且避免了在其中创建新连接每个请求。因此,请在文档中进行详细检查,以解决您的大部分难题。请注意,与严格的面向对象的Java相比,PHP在广泛的多线程机制,并发处理以及强大的异步事件处理方面没有那么先进。因此,以某种方式使PHP具有诸如池化之类的内置机制的效率非常低。