您的位置:首页 > 编程语言 > PHP开发

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

2013-08-07 00:13 148 查看
首先说一下问题:

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、避免长连接,使用短连接,一般mysql建立一个连接主要消耗在内存(4-8M),而现在的内存动则几十G,消耗还可以接受;

几个名词解释:

http的keepalivetimeout

文中第三条说到”apache子进程处理完PHP程序后,子进程会结束”,这个说法是不完全正确的.在默认情况下,它确实会结束.但某些情况下,他会继续生产.

在HTTP1.0版本中,如果用户发送了一个HTTP请求到PHP页面,要先和对应的服务器打开socket连接, 然后进行tcp/ip的三次握手, 才能通过http协议和apache通信, apache接受到请求后,就要把任务分发到子进程(如果子进程不够,还要生成子进程).请求处理完毕之后,子进程马上结束.但是,用户浏览一个网站的时候.很少会说只打开一个页面,他要打开不同的页面,查看不同的信息.如果是这样.用户每打开一个页面,都要经过三次握手,分发任务到子进程的过程,这样是浪费了很多资源的.

http1.1出现了connection字段, 这个字段表示,当子进程处理完一个请求之后,该进程是马上结束,还是先保持这个连接等待下一个请求.

如果子进程处理完成之后,没有马上结束,那他会等待多上时间呢?这是个很严重的问题.因为改子进程序保持着和客户端的连接,那就是说,在apache的主进程的角度上这个子进程的任务还没结束的.如果每一个字进程序都上时间等待,那么就可能没有资源来处理其他请求,导致服务器不能正常运行.

为了明确说明子进程的等待时间,apache有keepalivetimeout这个配置项,它表明当子进程的最长等待时间.在web上如何体现这个子进程是在等待的呢?

在开启keepalivetimeout的情况下,执行上面的PHP代码,如果你一直刷新,你会发现,该子进程的ID一直没有更改,由此说明,一直是同一个子进程处理你的请求.当你不对页面操作,让时间超过了keepalivetimeout中的时间,然后再去刷新一下,就会发现,进程id已经更改,由此说明,apache开启了一个新的进程来处理我们的请求.

apache的prefork模块的工作原理

apache下有很多种工作模式.下面我们只来简单介绍一下prefork模式(子进程级).另外一个很受欢迎的是work模式(子线程级).

当apache服务器启动的时候,如果是prefork工作模式,那么他就会开启指定数量的子进程序来等待任务.当apache接受到一个任务之后,他马上会把该任务派发到其中一个子进程去执行,当子进程数量不够的时候,他会继续开启更多的子进程来处理,直到子进程已经到达了限制的数量.

当apache接受到一个php页面请求的时候,他就会把这个任务分到某个子进程序,然后该子进程就会调用php5_module模块,以此模块来解释并执行对应的PHP程序,然后把结果返回到浏览器,然后子进程序结束.因为PHP是该子进程通过php5_module执行的,所以在PHP里面打印getmypid()的时候,输出的是该apache子进程的进ID号.

参考文章:
http://www.keepmyway.com/index.php/147.html http://www.nowamagic.net/librarys/veda/detail/95
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: