PHP长连接导致mysql连接数打满

PHP通过mysql_pconnect连接中间代理层,代理层再连MySQL,由于KeepAliveTime导致连接持续增长,占满连接数。解决方法包括设置合理的wait_timeout和interactive_timeout,以及避免长连接,使用短连接。Apache的prefork模块在处理请求后会保持子进程等待,keepalivetimeout控制其等待时间。
摘要由CSDN通过智能技术生成

首先说一下问题:

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、避免长连接,使用短连接&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值