什么是什连连接池 在实际应用开发中,一般会有很多访问下游的接池接池需求(下游包括但不限于服务/数据库/缓存),在并发量很低的何实时候,通常不会有任何问题的现连,但是什连当服务单机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就可以实现连接池,解决连接不可复用的问题。 当然以上只是一个示例,要想在生产环境中使用,仅仅这样肯定不够。这里推荐一个现成的工具——SMProxy。 SMProxy是一个基于mysql协议,使用swoole 开发的mysql数据库连接池。它有如下特色: 另外,也支持Laravel、ThinkPHP等国内主流框架。 所以,如果你正在使用PHP,而且也想使用连接池,那不妨看看这个工具。