1.php数据库连接池
php的数据库连接池一直以来是个难题,很多从php语言转向java项目,大多因为java有更好的连接池实现。
php的MySql扩展提供了长连接的API,但在PHP机器数量较多,规模较大的情况下,mysql_pconnect非但不能节约mysql资源,反而会加剧数据库的负荷。
假设有100台php的应用服务器,每个机器启动100个apache或者fpm进程(上篇php-fpm中介绍php-fpm会启动一个master和多个work进程,每个进程可能会处理一些请求,请求中有数据库的操作,此时想这么多请求有数据库的操作,那么数据库的单例模式是这个意思吗?),那每个进程都会产生一个长连接到MySQL。这一共会产生1万个My SQL连接。大家都知道MySQL是每个连接会占用1个线程。那MYSQL就需要创建1万个线程,这样大量的系统资源被浪费在线程间上下文切换上。而你的业务代码中并不是所有地方都在做数据库操作,所以这个就是浪费的。
连接池就不同了,100个worker进程,公用10个数据库连接即可,当操作完数据库后,立即释放资源给其他worker进程。这样就算有100台PHP的服务器,那也只会创建1000个MySQL的连接,完全可以接受的。
以前确实没有好的办法来解决此问题的,现在有了swoole扩展,利用swoole提供的task功能可以很方便做出一个连接池来。