LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: yanglei1979

我开发的一个网站老出现MYSQL连接过多的情况

[复制链接]
发表于 2007-5-12 08:40:36 | 显示全部楼层
Post by yanglei1979
看来LINUXSIR上面虽然平时不怎么热闹,但真正出现问题的时候,还是真正的高手都在这里的,太感谢了!


这次真是遇到怪事了!

刚开始我写的这套程序,是用mysql_connect()来进行连接的

后来因为出现连接数过多,MYSQL停止的问题,于是我在每个文件里面都加以下代码: mysql_close();

但加完以后,又出现了MYSQL连接丢失的提示.

是不是跟程序里面用 include_once(连接语句)  有关呢?


比如我这样写关闭语句应该没问题吧:


[PHP]<?php
include_once("db2.php");
$query = "select * from member where id='$_COOKIE[mid]' and md5(password)='$_COOKIE[password]' " ;
$result = mysql_db_query($DataBase, $query);
$login=0;

if($r = mysql_fetch_array($result))
{
$login=1;
}


if($login==1)
{
include_once("myindex.php");
exit;
}
mysql_free_result($result);
mysql_close($db);
//上面语句判断会员登录情况,login=0表示登录,为1表已经登录
?>
[/PHP]
没想到我加了这样的完全符合程序运行逻辑的代码以后,服务器运行一段时间就会死机,难道真的是PHP代码会把服务器搞死机吗?




注:以上测试如果在访问量小的情况下,是试不出来的,只有大大访问量的情况下才会试出来

实际上PHP程序就算是一个程序再有错误或死循环什么的,应该是影响当前执行页面吧,而不是影响整个服务器的运行,所以我觉得程序造成服务器的死机或停止服务,应该是不可能出现的吧.

因为当一个程序运行有错误的时候,应该是只对当前运行的页面,而不是针对所有的文件吧,当你关掉IE的时候,程序也就停止了,因此不会对服务器造成影响的,不知道大家是怎么认为的.


PHP当然会使服务器死机了。
PHP在Apache的进程下以服务程序的形式执行。出错的话,死机很正常,如果有做C等二进制代码CGI的就知道,更改BUG时,重启到手软。

不是include_once的错误,应该是你的程序逻辑有问题。
PS:看你的程序果然怪。
给出以下建议:
1.不要用Include,每次明确connect,用完close,这样利于维护;
2.请在query后明确加下connect名称。和1同理。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-12 08:53:06 | 显示全部楼层
Post by folklore
PHP当然会使服务器死机了。
PHP在Apache的进程下以服务程序的形式执行。出错的话,死机很正常,如果有做C等二进制代码CGI的就知道,更改BUG时,重启到手软。

不是include_once的错误,应该是你的程序逻辑有问题。
PS:看你的程序果然怪。
给出以下建议:
1.不要用Include,每次明确connect,用完close,这样利于维护;
2.请在query后明确加下connect名称。和1同理。



非常感谢!

我用的是把一个数据库连接帐号和密码包含在一个 db.php 文件里面,主要是为了以后程序换环境方便,如果每个页面都直接写 connect  的话,如果以后要改数据库密码的话,那不是要一千多个网站文件要全改吗?

所以我才用的 include_once();

那我现在该怎么办呢,服务器用半天就停一次,以前从来没出现过这种情况,以前至少都可以运行两三天就会有慢的现象,现在基本用半天就停一次.

请问到底该怎么解决呢?要不我用ADODB来对数据库操作行吗?听说ADODB把数据库操作都封装得很完善了.

我现在是用PHP最直接底层的代码来操作数据库的.
回复 支持 反对

使用道具 举报

发表于 2007-5-12 10:11:06 | 显示全部楼层
呵呵,这个嘛,只要username和psw等全局变量include进来就行了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-13 03:10:33 | 显示全部楼层
Post by folklore
呵呵,这个嘛,只要username和psw等全局变量include进来就行了。



学习了一种新的方法,太谢谢了!

你的意思是说:象 mysql_connect()这样的语句不要include进来,而是直接在程序里面写上是吗?

这个明白了

但我看DISCUZ等一些比较知名的PHP程序,也是包含的连接语句,用的是 require_once()
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-13 05:48:27 | 显示全部楼层
Post by folklore
PHP当然会使服务器死机了。
PHP在Apache的进程下以服务程序的形式执行。出错的话,死机很正常,如果有做C等二进制代码CGI的就知道,更改BUG时,重启到手软。

不是include_once的错误,应该是你的程序逻辑有问题。
PS:看你的程序果然怪。
给出以下建议:
1.不要用Include,每次明确connect,用完close,这样利于维护;
2.请在query后明确加下connect名称。和1同理。



关于PHP程序会把服务器搞死机的问题,我还有一个疑问?

一,如果PHP程序可以把服务器搞死机的话,那么我以前写采集网站的内容的程序的时候,都是每次循环5000至一万次的,甚至更多,每次循环几万次采集内容,那么这些提次为什么被采集的网站不受丝毫影响呢?我试过了,在采集的程序运行的时候,打开被采集的网站,速度没有任何影响,照常运行.

二,就按网站每天1000IP算,每个IP平均三个网页计算,那么每天打开的网页也就几千个而已,而打开这些网页的数量,在采集程序里面十几到几十分钟就做到了,那为什么后者又频繁网页又多却对服务器没任何影响,而前者又不太频繁网页又少,服务器却会死机呢?


三,我在自己电脑上做测试好下,我的电脑是赛扬三1100的CPU,256M内存,应该是比较老的机器了,硬盘5400转的普通硬盘,在我用JS每秒两次不停地刷新页面的时候,运行了十几分钟也打开了上千次网页吧,但对我自己电脑的性能却丝毫不受影响,   而服务器是双至强的CPU,2G内存,SCSC硬盘,和我自己的电脑比,简直一个天上,一个地下,服务器怎么会死机呢?
如果程序有问题的话,在我的配置很低的电脑上面应该会很快挂掉的,但却没有?难道要提高压力测试的强度?

实在是搞不明白.
回复 支持 反对

使用道具 举报

发表于 2007-5-13 08:43:58 | 显示全部楼层
Post by yanglei1979
关于PHP程序会把服务器搞死机的问题,我还有一个疑问?

一,如果PHP程序可以把服务器搞死机的话,那么我以前写采集网站的内容的程序的时候,都是每次循环5000至一万次的,甚至更多,每次循环几万次采集内容,那么这些提次为什么被采集的网站不受丝毫影响呢?我试过了,在采集的程序运行的时候,打开被采集的网站,速度没有任何影响,照常运行.

二,就按网站每天1000IP算,每个IP平均三个网页计算,那么每天打开的网页也就几千个而已,而打开这些网页的数量,在采集程序里面十几到几十分钟就做到了,那为什么后者又频繁网页又多却对服务器没任何影响,而前者又不太频繁网页又少,服务器却会死机呢?


三,我在自己电脑上做测试好下,我的电脑是赛扬三1100的CPU,256M内存,应该是比较老的机器了,硬盘5400转的普通硬盘,在我用JS每秒两次不停地刷新页面的时候,运行了十几分钟也打开了上千次网页吧,但对我自己电脑的性能却丝毫不受影响,   而服务器是双至强的CPU,2G内存,SCSC硬盘,和我自己的电脑比,简直一个天上,一个地下,服务器怎么会死机呢?
如果程序有问题的话,在我的配置很低的电脑上面应该会很快挂掉的,但却没有?难道要提高压力测试的强度?

实在是搞不明白.


和include没有关系。

      1.这是一定是因为你include文件后,关了它的connect,所以出错。因为:
include和直接写代码是一样的。所有,如果有两个$Con=mysql_Connect1,和$Con=mysql_Connect2,则第一个connect丢失,你关了第二个connect,再使用$Con时,会发生连接已关闭错误。

      2.如果没有内存泻漏等错误,正常的程序是不会死机的。死机一般也是Web Server死掉。你的程序消耗完了所有系统资源,做PHP程序本很产生非法操(一般是内存错误),所有死了...

     3.如果没有逻辑错误,用include是不会产生你所说的问题的。坚持每次connect和close的原因是,减少你所说的此类错误的机率。用include时要小心。如下:
$con=Connect();

...include (File1);
$res2=query(..,$con);
$close($con);

时,如果File1在也有一个$con变量,系统会认为这个$con和上一个$con是相同的变量。比如
$cat File1
$con=connect();
$res=runsqlquery("SqlStation",$con);
......
$close($con);
$

现在,inluce后变成:

$con=connect(); ##Connect 1

...
#######File1 was included#################
$con=connect();        #第一个$con丢失,产生资源程序泻漏。   
$res=runsqlquery("SqlStation",$con);
......
$close($con);               #因为加上了这一句,$res2的query将出错
#######File1 end here ###################

$res2=query();
close($con);

所以说,用include时要小心,很容易出错的。因为变量会打架。特别是在大的程序中,像$i(很多程序员都有C的经验吧)这样的变量...

所以,我又坚持另一个原则:变量先声明,再使用(像Perl和Basic这类语言我也就比较反感,一个变量被声明两次,一般在编译时就会报错,用include时也一样)。此外,上面贴子也说了另一个原则,明确写出完整的条件。比如perl中的 
print;

print $_;
语句是一样的。我一定写print $_; #因为要增加原代码长度,以显得我能写很长的程序#
此外,只是include $username和$psw而不是conect语句,那是因为,这样的话,我在程序中发现了一个"("(也就是connect),就一定会找到另一个和它对应的")"(也就是close), 这样我比较放心,#我比较胆小,;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-14 10:47:36 | 显示全部楼层
Post by folklore
和include没有关系。

      1.这是一定是因为你include文件后,关了它的connect,所以出错。因为:
include和直接写代码是一样的。所有,如果有两个$Con=mysql_Connect1,和$Con=mysql_Connect2,则第一个connect丢失,你关了第二个connect,再使用$Con时,会发生连接已关闭错误。

      2.如果没有内存泻漏等错误,正常的程序是不会死机的。死机一般也是Web Server死掉。你的程序消耗完了所有系统资源,做PHP程序本很产生非法操(一般是内存错误),所有死了...

     3.如果没有逻辑错误,用include是不会产生你所说的问题的。坚持每次connect和close的原因是,减少你所说的此类错误的机率。用include时要小心。如下:
$con=Connect();

...include (File1);
$res2=query(..,$con);
$close($con);

时,如果File1在也有一个$con变量,系统会认为这个$con和上一个$con是相同的变量。比如
$cat File1
$con=connect();
$res=runsqlquery("SqlStation",$con);
......
$close($con);
$

现在,inluce后变成:

$con=connect(); ##Connect 1

...
#######File1 was included#################
$con=connect();        #第一个$con丢失,产生资源程序泻漏。   
$res=runsqlquery("SqlStation",$con);
......
$close($con);               #因为加上了这一句,$res2的query将出错
#######File1 end here ###################

$res2=query();
close($con);

所以说,用include时要小心,很容易出错的。因为变量会打架。特别是在大的程序中,像$i(很多程序员都有C的经验吧)这样的变量...

所以,我又坚持另一个原则:变量先声明,再使用(像Perl和Basic这类语言我也就比较反感,一个变量被声明两次,一般在编译时就会报错,用include时也一样)。此外,上面贴子也说了另一个原则,明确写出完整的条件。比如perl中的 
print;

print $_;
语句是一样的。我一定写print $_; #因为要增加原代码长度,以显得我能写很长的程序#
此外,只是include $username和$psw而不是conect语句,那是因为,这样的话,我在程序中发现了一个"("(也就是connect),就一定会找到另一个和它对应的")"(也就是close), 这样我比较放心,#我比较胆小,;





说的真是太经典了!
尤其是"我比较胆小"这句,一语惊醒梦中人啊!

我现在的大部分源代码存在一个这样的问题:
include_once("db.php");
include_once("db.php");
include_once("db.php");
mysql_close($db);
也就是在一个页面会有"include_once("db.php");"这行语句出现三次甚至四次的情况出现,而我是统一在页尾用一个"mysql_close($db);"来关闭的.

请问这样行不行呢?如果不行的话,那真是找到问题的症结所在了.
我认为应该是可以的,因为include_once()是只包含一次的,也就是上面的三行包含实际上也只包含第一行的那个,所以上面这段代码应该是合理正确的,请问是吗?
这也是我为什么不用 require()和require_once()以及include()的原因.请指导一下.太感谢了.




db.php中的文件是这样的:
$db=mysql_connect('localhost','aaa','123') or die ("roblem connecting to DataBase");
$DataBase="dataone";
回复 支持 反对

使用道具 举报

发表于 2007-5-14 20:08:24 | 显示全部楼层
写个连接池,如果没有连接就生成一个,存在就使用原有的。
居我观察,就算程序中声明了关闭,实际上并不是这么回事。
回复 支持 反对

使用道具 举报

发表于 2007-5-16 16:13:05 | 显示全部楼层
Post by yanglei1979
说的真是太经典了!
尤其是"我比较胆小"这句,一语惊醒梦中人啊!

我现在的大部分源代码存在一个这样的问题:
include_once("db.php");
include_once("db.php");
include_once("db.php");
mysql_close($db);
也就是在一个页面会有"include_once("db.php");"这行语句出现三次甚至四次的情况出现,而我是统一在页尾用一个"mysql_close($db);"来关闭的.

请问这样行不行呢?如果不行的话,那真是找到问题的症结所在了.
我认为应该是可以的,因为include_once()是只包含一次的,也就是上面的三行包含实际上也只包含第一行的那个,所以上面这段代码应该是合理正确的,请问是吗?
这也是我为什么不用 require()和require_once()以及include()的原因.请指导一下.太感谢了.




db.php中的文件是这样的:
$db=mysql_connect('localhost','aaa','123') or die ("roblem connecting to DataBase");
$DataBase="dataone";




该问题上面其实已经回答了。请细看!

to:楼上
用PHP是无法写出真正的连接池的???
如果能写,如何实现。没地方保存变量的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-5-17 18:24:58 | 显示全部楼层
现在服务器内存老被占用完,2G的内存在服务器开机几个小时就被占用差不多了,请问会跟PHP程序有关吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表