PHP中的连接池

PHP中的连接池,php,connection-pooling,Php,Connection Pooling,在使用PHP时是否可以像在J2EE容器中一样缓存数据库连接?如果是,如何执行?您不能手动实例化连接池 但是您可以将“内置”连接池与函数一起使用。我想您使用的是mod_php,对吗 当一个PHP文件完成所有的执行时,它的状态将被终止,因此(在PHP代码中)没有办法进行连接池。相反,您必须依赖于扩展 您可以这样做,以便您的连接在页面完成后不会被关闭,这样它们就可以在下一个请求中被重用 这可能是您所需要的全部,但这与连接池不同,因为无法指定要保持打开的连接的数量。php中没有连接池。 mysql\u

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

您不能手动实例化连接池


但是您可以将“内置”连接池与函数一起使用。

我想您使用的是mod_php,对吗

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

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


这可能是您所需要的全部,但这与连接池不同,因为无法指定要保持打开的连接的数量。

php中没有连接池。
mysql\u pconnect连接池是两件不同的事情。 mysql\u pconnect有很多问题,首先你应该阅读手册并仔细使用,但这不是连接池

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

我们可以用php进行连接扩展,请点击以下链接:

因此在php中没有连接池

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

这是一篇好文章:


也请阅读这篇文章

持久连接与连接池完全不同。只有在同一请求/脚本执行上下文中进行多个db连接时,才会重用php中的持久连接。在大多数典型的web开发场景中,如果使用mysql\u pconnect,您将更快地最大化连接,因为您的脚本将无法在下一个请求中获取对任何打开连接的引用。在php中使用db连接的最佳方法是创建db对象的单例实例,以便在脚本执行的上下文中重用该连接。这仍然会导致每个请求至少1个db连接,但这比每个请求进行多个db连接要好

由于php的性质,php中没有真正的db连接池。Php不是一个应用服务器,它不能坐在请求之间,管理对开放连接池的引用,至少在没有某种重大黑客攻击的情况下是如此。我认为理论上你可以用php编写一个应用服务器,并将其作为命令行脚本运行,该脚本只需放在后台,保持一组数据库连接打开,并将对它们的引用传递给其他脚本,但我不知道在实践中是否可行,您如何将命令行脚本中的引用传递给其他脚本,我有点怀疑它是否会运行良好,即使您能够完成它。无论如何,这主要是猜测。我确实注意到了其他人发布到apache模块的链接,该链接允许对诸如php之类的预工作服务器进行连接池。看起来很有趣: 您可以使用

有关更多信息,请向下滚动至连接池部分@


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

我建议使用
PDO::ATTR_PERSISTENT


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

连接池在MySQL服务器端的工作方式如下

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

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

    如果在打开的连接池中找不到“主机、用户名、密码、套接字、端口和默认数据库”的给定组合的未使用的持久连接,则只有mysqli打开新连接,否则它将重用已打开的可用持久连接,这在某种程度上类似于连接池的概念。可以使用PHP指令mysqli.allow\u persistent启用和禁用持久连接。脚本打开的连接总数可以通过mysqli.max_链接进行限制(您可能会感兴趣,以解决达到托管服务器限制的max_用户_连接问题)。mysqli.max_persistent可以限制每个PHP进程的最大持久连接数

    在更广泛的编程环境中,这是web/AppServer的任务,但是在这种环境中,它由PHP本身的mysqli指令以支持连接重用的方式处理。您还可以实现一个singleton类,以获得连接的静态实例,以便像在Java中一样重用。他们只是想提醒大家,java也不支持将连接池作为其标准JDBC的一部分