在使用PHP时,是否可以像在J2EE容器中一样缓存数据库连接?如果可以,如何实现?
在使用PHP时,是否可以像在J2EE容器中一样缓存数据库连接?如果可以,如何实现?
在 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
我猜你正在使用mod_php,对吗?
当PHP文件执行完成后,它的所有状态都会被清除,所以无法在PHP代码中进行连接池。相反,你必须依靠扩展。
你可以使用mysql_pconnect,这样连接就不会在页面结束后关闭,它们会在下一个请求中被重用。
这可能就是你需要的全部内容,但这并不等同于连接池,因为没有办法指定要维护打开的连接数。
关于PHP,好消息是对于PHP生态中常见的数据库,它支持持久性数据库连接,可以将连接保留500个请求(在php.ini中配置max_requests),这避免了每次请求都创建新的连接。详细信息请参阅文档,它可以解决大多数问题。请注意,与严格面向对象的Java相比,在强大的异步事件处理、广泛的多线程机制和并发处理方面,PHP并不是那么复杂。因此,从某种意义上讲,像连接池这样的内置机制对于PHP的有效性来说非常低。
PDO::ATTR_PERSISTENT
。连接池在MySQL服务器端的工作方式如下。
因此,连接池选项实际上是在MySQL服务器端可用的。在PHP代码端没有选项。mysql_pconnect()只是一个包装器,通知PHP在脚本运行结束时不发送连接关闭请求信号。
对于像连接池这样的功能 - 您需要先安装swoole扩展:https://openswoole.com/
它为php添加了异步功能。
之后,添加mysql和redis连接池就很简单了:
https://github.com/open-smf/connection-pool
一些PHP框架已经内置了连接池功能:https://hyperf.wiki/2.2/#/en/pool