PHP - 连接池相关问题 - 学习/实践

1.应用场景

主要用于学习PHP连接池的问题,为什么PHP不支持连接池,以及有什么其他方法可以做到,或者替代方案~

2.学习/操作

1.文档阅读

PHP: Pool - Manual

池化技术 - 学习/实践_穿素白衫的少年的博客-CSDN博客  -- 推荐阅读

PHP Swoole之mysql数据库连接池的实现 - 简书

PHP连接池详解-php教程-PHP中文网

Connection pooling in PHP - Stack Overflow -- 推荐

PHP: 数据库持久连接 - Manual

https://blogs.oracle.com/opal/post/highly-scalable-connection-pooling-in-php

https://apache2.com/2.2.2/mod/mod_dbd.html

https://www.quora.com/Why-does-PHP-not-support-database-connection-pool。-- 为什么PHP不支持数据库连接池 -- 推荐

php pdo支持连接池吗 - SegmentFault 思否

韩天峰(Rango)的博客 » 基于swoole扩展实现真正的PHP数据库连接池

连接池 - 数据库短连接&长连接&连接池 - 学习/实践_穿素白衫的中少年的博客-CSDN博客

2.整理输出

2.1 什么是PHP连接池?

这里说的PHP连接池通常指的是PHP去连接其他服务的连接池

如,缓存连接池「Redis/Memcached」,数据库连接池「MySQL」等

2.2 为什么需要连接池「应用场景」

在程序中,我们会用各种池化技术来缓存创建昂贵的对象,比如线程池、连接池、内存池「本质上就是计算机硬件资源 -- CPU,内存,网络,磁盘等」。

一般是预先创建一些对象放入池中,使用的时候直接取出使用,用完归还以便复用,还会通过一定的策略调整池中缓存对象的数量,实现池的动态伸缩。

由于线程的创建比较昂贵,随意、没有控制地创建大量线程会造成性能问题,因此短平快的任务一般考虑使用线程池来处理,而不是直接创建线程。

使用场景

1、在有大量短查询「短平快」的业务场景下

2、大量长查询「长陡慢」的业务场景下不适合使用线程池,由于长查询占据了线程池的线程,导致线程池出现效率低下的情况

发散:

连接池和线程池两种技术,会发现它们都有一个共同点:

它们所管理的对象,无论是连接还是线程,它们的创建过程都比较耗时,也比较消耗系统资源。

所以,我们把它们放在一个池子里统一管理起来,以达到提升性能和资源复用的目的。

2.3 什么时候出现「历史发展」

大话数据库连接池简史,你都用过几个? - 腾讯云开发者社区-腾讯云

后续整理吧,大致看来,

数据库连接池技术已经到了第二代,

至于缓存连接池技术则应是借鉴数据库连接池,或者其他池化技术,

技术本来就是相互学习,借鉴的方式进行发展。

2.4 怎么实践

综上可知:

PHP-FPM的进程模型,是不支持连接池的。

PHP默认使用进程模型来执行,并且无法在进程之间共享资源,因此连接池是不可能的,例如Java中的Tomcat,默认情况下你有线程和一个公共内存能够共享对象。

PHP 本质上为每个进程都有一个实例,并且只能在其中进行持久连接。

https://www.quora.com/Why-does-PHP-not-support-database-connection-pool

但是PHP可以借助工具,实现连接池

PHP实现连接池,方式有如下几种

1. PHP PDO扩展 + pdo_odbc驱动

2. PHP + Nginx + Lua

3. PHP + Swoole「本质上就是PHP + C语言扩展

2.5 技术本质,用最简短的话

实现原理:

设计连接池也没有多么复杂,大致的步骤就是:

  1. 初始化连接;
  2. 业务取出连接;
  3. 业务发送请求;
  4. 放回连接。

除了上面的基本功能以外,还要处理并发问题,多数据库服务器和多用户,事务处理,连接池的配置与维护。

大概就这些功能。有了连接池之后,连接的建立和释放跟业务就没有关系,交给交接池来维护。

PHP实现的连接池

本质上就是PHP + 其他,原因就是PHP自身的运行机制不支持连接池,只好借助其他工具

临时

28 | 4D总结法:怎么展示你的工作亮点?-极客时间

后续补充

...

3.问题/补充

1. 连接池应该由只是服务端来实现,还是要客户端配合来实现?

这里拿应用服务器PHP 和 数据库服务器MySQL为例

即,前者为client,后者位server

结合Swoole实现数据库连接池的代码,可初步认为只需要PHP应用服务器实现连接池即可。

韩天峰(Rango)的博客 » 基于swoole扩展实现真正的PHP数据库连接池

2. PHP连接池,指的是对各种存储服务的连接池吗?

不只是存储服务,任何两个需要进行通信进行连接的服务都可以使用连接池。

3. 持久化连接与连接池的区别?

后者是前者的进化,改进。

持久连接是为了解决短连接反复建立和销毁性能消耗,为了性能提升。

但是「PHP 的」长连接本身并不健壮。一旦网络异常导致长连接失效,没有办法自动关闭重新连接,以至于后续请求全部失败,此时除了重启服务别无它法!

而且,在高并发下,不论是短连接还是长连接,一旦连接数达到很大的数量,同时就会产生很多的线程

就会导致服务器CPU上下文频繁切换,性能急剧下降。

长连接是一些驱动、驱动框架,ORM工具的特性,由驱动来保持连接句柄的打开,以便后续的数据库操作可以重用连接,从而减少数据库的连接开销。

连接池是应用服务的组件,可以通过参数来配置连接数、连接监测、连接的生命周期。

通过维持固定范围内的连接数,不会导致维护连接的线程数很大,CPU切换不会很频繁。

比较繁忙时,连接数可以增加,不繁忙时,连接数可以减少,动态变化。

4.参考

参见文档阅读列表

后续补充

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值