php如何实现连接池

本篇内容介绍了“php如何实现连接池”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

成都创新互联企业建站,10多年网站建设经验,专注于网站建设技术,精于网页设计,有多年建站和网站代运营经验,设计师为客户打造网络企业风格,提供周到的建站售前咨询和贴心的售后服务。对于成都做网站、网站制作中不同领域进行深入了解和探索,创新互联在网站建设中充分了解客户行业的需求,以灵动的思维在网页中充分展现,通过对客户行业精准市场调研,为客户提供的解决方案。

什么是连接池

在实际应用开发中,一般会有很多访问下游的需求(下游包括但不限于服务/数据库/缓存),在并发量很低的时候,通常不会有任何问题的,但是当服务单机QPS达到几百、几千、甚至上万的时候,如果每一次访问还是必须经历建立连接=》收发请求=》关闭连接=》释放资源等步骤,系统的性能必然会急剧下降,甚至会导致系统崩溃。

连接池正是是解决这个问题最常用的方法,其思想非常简单,即是在服务启动的时候,先建立好若干连接,当有请求过来,就从中取出一个,执行下游操作,执行完再放回,从而避免反复的建立和销毁连接,以提升性能。

如何实现连接池

连接池是一个独立的服务,需要常驻进程。一个完整的连接池操作,通常要经历如下几步:

(1)建立连接池对象(服务启动)。

(2)按照事先指定的参数创建初始数量的连接(即:空闲连接数)。

(3)对于一个访问请求,直接从连接池中得到一个连接。如果连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的连接;如果达到最大,则设定一定的超时时间,来获取连接。

(4)运用连接访问服务。

(5)访问服务完成,释放连接(此时的释放连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。

(6)释放连接池对象(服务停止、维护期间,释放连接池对象,并释放所有连接)。

Java对连接池比较友好,有着很多成熟的解决方案,如DBCP  、C3P0、Druid等。而PHP在这方面就相对较弱,虽然MySQL提供了长连接的API,但在PHP机器数量较多,规模较大的情况下,mysql_pconnect非但不能节约MySQL资源,反而会加剧数据库的负荷。这主要是由于它需要依赖apache或fpm,比如,假设有100台PHP的应用服务器,每个机器需要启动100个apache或fpm工作进程,每个进程都会产生一个长连接到MySQL,这样一共会产生1万个My  SQL连接。大家都知道,MySQL是每个连接会占用1个线程,如果有1万个连接,那MYSQL就需要创建1万个线程,这样大量的系统资源会被浪费在线程间上下文切换上。实际上,你的业务代码中并不是所有地方都在做数据库操作,所以,如果创建了这么多的连接,但是很多都是空闲的,那这样就会很浪费资源。

鉴于此,PHP要想独立解决连接复用的问题,那必须实现自己的连接池。所幸,PHP扩展swoole刚好可以做到这一点,利用swoole提供的task功能可以很方便做出一个连接池来。

如下是使用swoole实现连接池的部分代码:

php如何实现连接池

通过这一段代码,PHP就可以实现连接池,解决连接不可复用的问题。

当然以上只是一个示例,要想在生产环境中使用,仅仅这样肯定不够。这里推荐一个现成的工具——SMProxy。

SMProxy是一个基于mysql协议,使用swoole 开发的mysql数据库连接池。它有如下特色:

  • 支持读写分离

  • 支持数据库连接池,能够有效解决 PHP 带来的数据库连接瓶颈

  • 支持 SQL92 标准

  • 采用协程调度

  • 支持多个数据库连接,多个数据库,多个用户,灵活搭配

  • 遵守 MySQL 原生协议,跨语言,跨平台的通用中间件代理

  • 支持 MySQL 事务

  • 支持 HandshakeV10 协议版本

  • 完美兼容 MySQL5.5 - 8.0

  • 兼容各大框架,无缝提升性能

另外,也支持Laravel、ThinkPHP等国内主流框架。

所以,如果你正在使用PHP,而且也想使用连接池,那不妨看看这个工具。

“php如何实现连接池”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!


新闻名称:php如何实现连接池
文章分享:http://azwzsj.com/article/jhccec.html