您的位置 首页 php

拥抱swoole(六)用php实现数据库连接池

4a9539b763344e43a244866928e8895f-1

为什么要创建数据库连接池?

连接池是可以有效降低 mysql -Server负载的。原理是 连接池使用一个共享资源的模式,如并发100个请求,实际上并不是每个请求的所有时间都在执行SQL查询。这样100个请求,共享20个MySQL连接就可以满足需求了。当一个请求操作完数据库后,开始进入模板渲染等流程,这时就会释放数据库连接给其他的请求使用。

连接池仅在超大型应用中才有价值。普通的应用采用MySQL 长连接 方案,每个php-fpm创建一个MySQL连接,每台机器开启100个php-fpm进程。如果有10台机器,每台机器并发的请求为100。实际上只需要创建1000个MySQL连接就能满足需求,数据库的压力并不大。即使有100台机器,硬件配置好的存储服务器依然可以承受。

达到数百或者数千台应用服务器时,MySQL服务器就需要维持十万级的连接。这时数据库的压力就会非常大了。连接池技术就可以派上用场了,可以大大降低数据库连接数。

如何实现?

1 同步阻塞模式

可基于swoole的AsyncTask模块实现的连接池,编程简单,没有数据同步和锁的问题。甚至可以多个服务共享连接池。缺点是: 1. 灵活性不如 多线程 连接池,无法动态增减连接 2. 有一次 进程间通信 的开销

2 协程模式

可使用channel实现连接池。

我个人推荐使用协程模式,使用协程效率高。

如果用协程实现?

实现原理,其实swoole也有类似go语言的channel,我们实例化一定数量的mysql的 pdo 连接,然后把pdo连接放到channel里面,channel支持push和pop,channel是作用域是在整个进程,所以在一个进程中,如果channel已经为空,就得等待其它协程释放连接资源,否则就会挂起。

长时间不用的连接要定时释放

可以在进程中,通过一个定时器,检查每次连接的上次使用时间,如果已经过期,就释放掉,从而减轻mysql的负载。


大家可以动手试一试,明白了道理后,其实很简单的。

文章来源:智云一二三科技

文章标题:拥抱swoole(六)用php实现数据库连接池

文章地址:https://www.zhihuclub.com/77101.shtml

关于作者: 智云科技

热门文章

网站地图