1. 基于 workman 或者 swoole 这样的常驻内存的框架是可以实现连接池的, 但是这种运行模式与 php-fpm 完全不一样了,需要对原来的项目进行大量的改造,传统项目实现成本较高,新项目可以考虑使用。
  2. 对于传统的 php-fpm 项目可以使用本地代理的方式来实现,每个项目本地建立一个代理服务, 代理服务与 mysql 建立长连接和连接池,项目访问代理服务来与 mysql 通信。

Mysql

mysql 代理服务umyproxy,代理服务支持连接池,不需要对项目进行大量的改动,仅仅修改配置即可。

https://github.com/lyuangg/umyproxy

mycat(国内开源软件)

SMProxy Swoole MySQL Proxy 一个基于 MySQL 协议,Swoole 开发的MySQL数据库连接池。 A MySQL database connection pool based on MySQL protocol and Swoole.

https://github.com/louislivi/SMProxy

MongoDb

警惕PHP的MongoDB连接 | Coding House

你每起一个PHP-FPM的Worker进程,都会建立一个MongoDB连接(需要有请求进来并触发连接建立),所以MongoDB的连接数等价于你的Worker的进程总数

一是换其他有连接池的语言;二是降低Worker的进程数量,变相降低连接数;三是找个 Mongodb 连接池或者中间代理

php-fpm,每台机器设置了800个进程,每个进程默认驱动会保持一个长连接,导致客户端会话数过大,每台服务器需要占用800个链接会话。

所以找了很久的解决方案最终在官方文档中发现有该配置可以关闭长连接模式,可以解决这个问题。

$manager = new MongoDB\\Driver\\Manager(URI, [], ['disableClientPersistence' => true]);

默认情况下为false,这将保留现有行为。指定true将强制Manager创建一个新的libmongoc客户端,然后当Manager对象被释放时(例如垃圾回收、PHP请求结束),该客户端将被销毁(即套接字关闭)

MongoDB PHP-FPM导致连接数过多,达到最大上限数,浪费资源解决方案! - LouisLivi的个人博客