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

1.应用场景
主要用于学习PHP连接池的问题,为什么PHP不支持连接池,以及有什么其他方法可以做到,或者替代方案~
2.学习/操作
1.文档阅读
PHP: Pool -
池化技术 - 学习/实践_穿素白衫的少年的博客-CSDN博客 -- 推荐阅读
PHP 之mysql数据库连接池的实现 - 简书
PHP连接池详解-php教程-PHP中文网
in PHP - Stack -- 推荐
PHP: 数据库持久连接 -
。-- 为什么PHP不支持数据库连接池 -- 推荐
php pdo支持连接池吗 -思否
韩天峰(Rango)的博客 ? 基于扩展实现真正的PHP数据库连接池
连接池 - 数据库短连接&长连接&连接池 - 学习/实践_穿素白衫的中少年的博客-CSDN博客
2.整理输出 2.1 什么是PHP连接池?
这里说的PHP连接池通常指的是PHP去连接其他服务的连接池
如,缓存连接池「Redis/」,数据库连接池「MySQL」等
2.2 为什么需要连接池「应用场景」
在程序中,我们会用各种池化技术来缓存创建昂贵的对象,比如线程池、连接池、内存池「本质上就是计算机硬件资源 -- CPU,内存,网络,磁盘等」 。
一般是预先创建一些对象放入池中,使用的时候直接取出使用,用完归还以便复用,还会通过一定的策略调整池中缓存对象的数量,实现池的动态伸缩 。
由于线程的创建比较昂贵,随意、没有控制地创建大量线程会造成性能问题,因此短平快的任务一般考虑使用线程池来处理,而不是直接创建线程 。
使用场景
1、在有大量短查询「短平快」的业务场景下
2、大量长查询「长陡慢」的业务场景下不适合使用线程池,由于长查询占据了线程池的线程,导致线程池出现效率低下的情况
发散:
连接池和线程池两种技术,会发现它们都有一个共同点:
它们所管理的对象,无论是连接还是线程,它们的创建过程都比较耗时,也比较消耗系统资源 。
所以,我们把它们放在一个池子里统一管理起来,以达到提升性能和资源复用的目的 。
2.3 什么时候出现「历史发展」
大话数据库连接池简史,你都用过几个? - 腾讯云开发者社区-腾讯云
后续整理吧,大致看来,
数据库连接池技术已经到了第二代,
至于缓存连接池技术则应是借鉴数据库连接池,或者其他池化技术,
技术本来就是相互学习,借鉴的方式进行发展 。
2.4 怎么实践
综上可知:
PHP-FPM的进程模型,是不支持连接池的 。
PHP默认使用进程模型来执行,并且无法在进程之间共享资源,因此连接池是不可能的,例如Java中的,默认情况下你有线程和一个公共内存能够共享对象 。
PHP 本质上为每个进程都有一个实例,并且只能在其中进行持久连接 。
但是PHP可以借助工具,实现连接池
PHP实现连接池,方式有如下几种
1. PHP PDO扩展 + 驱动
2. PHP + Nginx + Lua
3. PHP + 「本质上就是PHP + C语言扩展」
2.5 技术本质,用最简短的话
实现原理:
设计连接池也没有多么复杂,大致的步骤就是:
初始化连接;业务取出连接;业务发送请求;放回连接 。
除了上面的基本功能以外,还要处理并发问题,多数据库服务器和多用户,事务处理,连接池的配置与维护 。
大概就这些功能 。有了连接池之后,连接的建立和释放跟业务就没有关系,交给交接池来维护 。
PHP实现的连接池
本质上就是PHP + 其他,原因就是PHP自身的运行机制不支持连接池,只好借助其他工具

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

文章插图