在使用php7的生产环境中遇到MongoDB连接数量飙升,遇到了连接释放不掉的问题,在编写代码时并未使用长连接,排查后得知,在php5.6版本使用的客户端为MongoClient,该客户端是支持在创建连接的时候传入persistent参数指定连接方式是长连接还是短链接。因此在php-fpm运行模式的情况下可以控制连接的释放。php7版本中推出了新的连接客户端MongoDB\Driver\Manager,而目前的主流框架中都是用了这个客户端,该客户端不再支持连接控制,驱动底层默认采用长连接的方式(可能是为了查询效率)。因此,在代码中释放连接句柄并不能真正关闭连接,这就导致开启多少php-fpm进程就会有多少个mongo连接,出现mongo连接资源耗尽的问题。
解决办法:
1、自建mongodb连接池或使用三方连接代理
2、通过重启php-fpm work进程释放mongo连接
我直接采用了第2种方式,php-fpm提供了**【pm.max_requests】**(默认值0表示不会重新启动)选项来控制单个php-fpm work进程处理的最大请求数量,当达到设置的数量后,php-fpm master会重启该work进程。这个选项的目的是防止一些三方库出现的内存泄露问题。
pm.max_requests = 10