经常遇到很多朋友问到,他的Mysql中有很多Sleep进程,严重占用Mysql的资源,现在合肥PHP培训班就个大家一起分析一下出现这种现象的原因和解决办法:

1,通常来说,Mysql出现大量Sleep进程是因为采用的PHP的Mysql长链接数据库方式,即使用了Mysql_pconnect来打开链接数据库,解决办法就是使用“短”链接,即Mysql_connect函数。

2,在使用Mysql_connect短链接方式打开数据库,每个页面在打开数据库后,执行SQL完成,当页面脚本结束的时候,这个Mysql连接会自动关闭并且释放内存。但仍然出现大量Sleep进程,可以看看网站是否存在以下几个方面的问题。

A,硬盘上存在大量的静态文件,或者WEB服务器负荷太重,在处理HTTP请求响应变得太慢,这样也有可能导致出现大量Sleep进程,解决方法适当调整WEB服务参数和文件,一味的静态或者缓存化网页内容并不是灵丹妙药。

B,在网页脚本中,有些计算和应用可能非常耗时,比如在0秒的时候打开数据库执行完一段SQL代码后,网页脚本随即花了20秒钟进行一段复杂的运算,或者是require了一个庞大的PHP文件(比如含有几千个违规关键字的过滤函数),哪么这个时候在Mysql后台看到的进程中,这个20秒的过程

Mysql并没有做任何事情了,一直处于Sleep状态,直到这个页面执行完毕或者达到wait_timeout值(被强行关闭),优化网页脚本,尽量让程序快速运行,或者在执行这段耗时的运行过程中,执行Mysql_close把当前Mysql链接强行关闭。

C,在采集站中,Mysql中大量的Sleep进程这类现象尤其明显(比如很多网友问道DeDeCMS的Mysql中出现大量Sleep),因为大部的采集器页面在运行过程中,事先打开了一个Mysql链接(可能是为了验证用户权限等),然后开始使用file_get_contents之类的操作去获取一个远程的网页内容,如果这个远程的站点访问速度太慢,比如花了10秒时间才把网页取回,哪么当前采集脚本程序就一直阻塞在这里,并且Mysql啥事也没干,一直处于Sleep状态。解决方法同上,在发出file_get_contents采集远程网页的时候,使用Mysql_close强行关闭Mysql的连接,等采集完成在适当需要的时候再重新Mysql_connect即可。