首先说一下问题:
PHP使用mysql_pconnect连接到中间代理层,代理层再连接mysql,连接过程中出现代理层到mysql之间的连接持续增长;
原因:
当PHP发起一个连接到WebServer的时候,PHP的mysql模块会把当前的连接以key=》values的形式保存起来(进程号的MD5),当下次连接的时候就会比较当前进程的IDMD5值和连接池中的valuse对比,一旦匹配上那么就继续使用上一个连接数,否则就重新打开一个连接并存起来;
因为有KeepAliveTime的存在,我们可以保持同一个进程id,所以如果我们在KeepAliveTime内,我们访问mysql的时候,使用的是同一个mysql资源.但如果超过了KeepAliveTime的时间,那么apache会开启新的进程来处理我们的请求,进程id改变.所以我们连接mysql的时候,也只能打开新的mysql连接.我们打开了新的连接,但是旧的连接依然是存在的,但是我们已经没办法用了,因为我们没办法决定自己使用哪个进程id.既然我们没办法使用这个资源,同样地,我们也没办法关闭它.那它只有一直在等待,直到等到了一定的时间,mysql本身来回收他.而他在等待的过程中,他还是占着连接数的.所以在这种情况下,就会很多的连接没办法用,却也没办法关闭他,我们要不停得打开新的连接,却没办法关闭旧连接.这样就会造成mysql的连接数过多的错误;
解决办法:
1、设置合理的wait_timeout,interactive_timeout值,让mysql来会收这部分连接;
2、避免长连接,使用短连接&