大家请看我写的类会造成数据库资源耗尽么?

时间:2021-11-29 21:45:08
类如下,使用过程中发现不一会数据库资源就耗尽了需要restart才行,请各位帮忙看看

class DB{
   var $host;
   var $username;
   var $password;
   var $database;
   var $conn;
   
   function DB()
   {
     $this->host = "localhost:3306";
 $this->username = "root";
 $this->password = "dd";
 $this->database = "bookstore";   
   }
   
   function Connect()
   {
     $this->conn = mysql_connect($this->host,$this->username,$this->password) or
 die ("could not connect to $this->host");
 mysql_select_db($this->database,$this->conn) or
 die ("could not switch to $this->database");
 return $this->conn;  
   }
   
   function Close()
   {
     mysql_close($this->conn);
   }
   
   function Query($sql)
   {  
     //echo $sql;
     $res = mysql_query($sql,$this->conn) or
 die("could not query database");
 return $res;
   }
   
   function GetRowsNum($res)
   {
     $rowno = 0;
 $rowno = mysql_num_rows($res);  
 return $rowno;
   }

}

使用过程中是这么使用的

$mydb = new DB();

$sql = "select * from table order by id desc"; //这个表只有50条记录
$mydb->Connect();
$res = $mydb->query($sql);

while ( $myrow = mysql_fetch_array($res) {
echo $myrow["id"]

}

$mydb->close();

大概就是这么用的,但是反复使用过程中发现数据库经常挂住,请问我写的类对么??我数据库打开的时候我最后页关闭了,请各位看看是否有问题,谢谢

16 个解决方案

#1


没有。网页关闭,服务进程也会关。自然Myql也关闭。

#2




$mydb = new DB();

$sql = "select * from table order by id desc"; //这个表只有50条记录
$mydb->Connect();
$res = $mydb->query($sql);

while ( $myrow = mysql_fetch_array($res) {
echo $myrow["id"]


mysql_free_result($res);   //自己写相应的方法  //你应该检查多方面检查。

$mydb->close();

#3


如果这样写访问量大一些的话可能会挂掉(个人认为)
每次new一个DB都应该会产生一个数据库连接
个人认为如果所有用户共享一个数据库连接,
或者不同类型的用户共享一个连接比较好(比如电影版的用户共享一个连接,电视版用户共享一个连接)

刚学PHP不久,仅供参考,说错了可不要笑话我:)

#4


看起来是不会的!

会不会是你的服务器有问题!

#5


用 ADODB 好了。没有必要每个人都自己写个 DB类

#6


我个人觉得是APACHE 中 PHP内存设定的问题。

你这么做,没有limit的情况下,在大数据量的情况下,PHP吃内存的情况非常严重。

我测试过,在PHP内存为8MB,对300个记录进行各种判断,存入数组等等各种操作的情况下就已经是非常严重了。

#7


严重关注这个问题!

请教各位几个上面解答中的疑惑:

1、mysql_free_result这个方法有必要么?(程序在毫秒计的时间内运行完毕后马上就自动释放了吧)

2、共享mysql连接,这个怎样实现?怎样让b用户使用a用户开启的长连接?

3、我想这个和类本身没有关系。但是区区几十条记录,怎么会导致服务器的mysql频繁当?而不是apache?

4、有些时候要选择数据表的总记录数,必须进行无limit的简单查询,这样吃内存严重?怎么办?

5、存入数组和300个记录判断造成严重吃内存是指往哪里?

#8


这个基本不会有什么问题。如果你感觉那里不对了。尽量把具体现象说出来! 要说代码吗。这个那里会有什么浪费资源的. 你的MYSQL如果经常挂,建议去看看MYSQL进程是不是有死掉的,如果对MYSQL熟悉,自己写个守护进程好了.当然这样就麻烦些了。反正一句话,如果MYSQL经常挂,还是去找MYSQL本身吧!!

#9


我以前也发现pear DB函数经常把mysql挂了
后来我重新写过DB类才行。
mysql释放不了资源
至今不懂是什么问题造成的

#10


不会啊。网页关闭,连接也关闭。长连接就不知道了。但不可能在php平台层面上实现a用户资源给b用户。除非你在自己的程序里建立对应的缓冲机制(也就是应用层)
查询总记录数,可以 select 其中一个小的字段吧?不必要 *
300个记录应该不算什么吧。看你的数据是怎样了。和存的方法。

#11


我是在国外申请的空间和服务器,网站经常突然down掉(就是数据库的问题,因为访问静态网页可以), 联系了管理员,他们让我检查我的程序是否在结尾没有关闭数据库,我检查了,开始确实这样,后来关闭了,但是偶尔还会发生, 后来他们说页可能是其他客户的问题,因为我们都是共享的mysql,如果他们的程序有问题,我的也会牵连进去....55555.

#12


select *要比select id快。mysql优化上是这么写的。

#13


从来没有用过 mysql_close,呵呵。。

“select *要比select id快。”
单单指在mysql数据库中查询速度,并不代表整体速度。呵呵,还有其他因素的,如果web与数据库不在一台机器上,网络速度影响也很大,尤其*里面有很多东东的时候,呵呵。再说,消耗资源也不小,还是全程的消耗。呵呵


另外,lz,现在有很多现成的数据库操作类,拿来看看就知道很多问题:)

#14


mysql_free_result mysql_close()都必须有....
得到记录集马上断开连接...

我的DB类...共享一下..写得不算好,但从来没有挂过服务器


#15


class Database
{
    var $server    = "";
    var $database  = "";
    var $user    = "";
    var $password  = "";
    var $msgflag   = "";
    var $link      = "";
    var $error     = "<center><h1>The database connection error</h1></center>";

function Database(){


    }
    
function getConnectionToDBX1(){
$this->link=@mysql_connect("192.168.0.1","admin","admin")
or die($this->error);
@mysql_select_db("door_server",$this->link);
@mysql_query("set autocommit=0");
}


    /*
    *
    * method   : release()
    * description : 释放数据库的连接
    * parameter   : 已连接的数据库标识
    * return   : 成功返回true;失败返回false;
    *
    */

    function release(){
@$this->execute("commit");
return mysql_close($this->link);
    }


    /*
    *
    * method   : select($sql)
    * description : 取得记录集
    * parameter   : sql查询语句,数据库连接标识
    * return   : 返回类型:array 
    *               array中的每一个元素为mysql_fetch_object()得到的对象
    *
    */

    function select($sql){

  $i=0;
$array_result="";
//mysql_unbuffered_query 
    $db_result=mysql_unbuffered_query($sql,$this->link);
     if($db_result){
while($row=mysql_fetch_object($db_result)){
$array_result[$i] = $row;
$i++;
}
mysql_free_result($db_result);

     }else{
echo "<!--出错了:" . $sql."-->";
return false; 
     }
$this->manage_log($sql);
return $array_result;
    }


    
    
    /*
    *
    * method   : execute($sql)
    * description : 更新记录
    * parameter   : sql更新语句,数据库连接标识
    * return   : 返回类型:boolean 
    *
    */

    function execute($sql){
//$sql = str_replace("\\","\\\\",$sql);
     $result=mysql_query($sql,$this->link);
     if(!$result){
     echo "<!--出错了:" . $sql."-->";
     return false;
     }else{
$this->manage_log($sql);
     return true;
}
    }
   }
太长了,只贴到这里

#16




mysql_unbuffered_query
(PHP 4 >= 4.0.6)

mysql_unbuffered_query --  向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行 
说明
resource mysql_unbuffered_query ( string query [, resource link_identifier])


mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query() 那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier。 

注: mysql_unbuffered_query() 的好处是有代价的:在 mysql_unbuffered_query() 返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。 

参见 mysql_query()。 

#1


没有。网页关闭,服务进程也会关。自然Myql也关闭。

#2




$mydb = new DB();

$sql = "select * from table order by id desc"; //这个表只有50条记录
$mydb->Connect();
$res = $mydb->query($sql);

while ( $myrow = mysql_fetch_array($res) {
echo $myrow["id"]


mysql_free_result($res);   //自己写相应的方法  //你应该检查多方面检查。

$mydb->close();

#3


如果这样写访问量大一些的话可能会挂掉(个人认为)
每次new一个DB都应该会产生一个数据库连接
个人认为如果所有用户共享一个数据库连接,
或者不同类型的用户共享一个连接比较好(比如电影版的用户共享一个连接,电视版用户共享一个连接)

刚学PHP不久,仅供参考,说错了可不要笑话我:)

#4


看起来是不会的!

会不会是你的服务器有问题!

#5


用 ADODB 好了。没有必要每个人都自己写个 DB类

#6


我个人觉得是APACHE 中 PHP内存设定的问题。

你这么做,没有limit的情况下,在大数据量的情况下,PHP吃内存的情况非常严重。

我测试过,在PHP内存为8MB,对300个记录进行各种判断,存入数组等等各种操作的情况下就已经是非常严重了。

#7


严重关注这个问题!

请教各位几个上面解答中的疑惑:

1、mysql_free_result这个方法有必要么?(程序在毫秒计的时间内运行完毕后马上就自动释放了吧)

2、共享mysql连接,这个怎样实现?怎样让b用户使用a用户开启的长连接?

3、我想这个和类本身没有关系。但是区区几十条记录,怎么会导致服务器的mysql频繁当?而不是apache?

4、有些时候要选择数据表的总记录数,必须进行无limit的简单查询,这样吃内存严重?怎么办?

5、存入数组和300个记录判断造成严重吃内存是指往哪里?

#8


这个基本不会有什么问题。如果你感觉那里不对了。尽量把具体现象说出来! 要说代码吗。这个那里会有什么浪费资源的. 你的MYSQL如果经常挂,建议去看看MYSQL进程是不是有死掉的,如果对MYSQL熟悉,自己写个守护进程好了.当然这样就麻烦些了。反正一句话,如果MYSQL经常挂,还是去找MYSQL本身吧!!

#9


我以前也发现pear DB函数经常把mysql挂了
后来我重新写过DB类才行。
mysql释放不了资源
至今不懂是什么问题造成的

#10


不会啊。网页关闭,连接也关闭。长连接就不知道了。但不可能在php平台层面上实现a用户资源给b用户。除非你在自己的程序里建立对应的缓冲机制(也就是应用层)
查询总记录数,可以 select 其中一个小的字段吧?不必要 *
300个记录应该不算什么吧。看你的数据是怎样了。和存的方法。

#11


我是在国外申请的空间和服务器,网站经常突然down掉(就是数据库的问题,因为访问静态网页可以), 联系了管理员,他们让我检查我的程序是否在结尾没有关闭数据库,我检查了,开始确实这样,后来关闭了,但是偶尔还会发生, 后来他们说页可能是其他客户的问题,因为我们都是共享的mysql,如果他们的程序有问题,我的也会牵连进去....55555.

#12


select *要比select id快。mysql优化上是这么写的。

#13


从来没有用过 mysql_close,呵呵。。

“select *要比select id快。”
单单指在mysql数据库中查询速度,并不代表整体速度。呵呵,还有其他因素的,如果web与数据库不在一台机器上,网络速度影响也很大,尤其*里面有很多东东的时候,呵呵。再说,消耗资源也不小,还是全程的消耗。呵呵


另外,lz,现在有很多现成的数据库操作类,拿来看看就知道很多问题:)

#14


mysql_free_result mysql_close()都必须有....
得到记录集马上断开连接...

我的DB类...共享一下..写得不算好,但从来没有挂过服务器


#15


class Database
{
    var $server    = "";
    var $database  = "";
    var $user    = "";
    var $password  = "";
    var $msgflag   = "";
    var $link      = "";
    var $error     = "<center><h1>The database connection error</h1></center>";

function Database(){


    }
    
function getConnectionToDBX1(){
$this->link=@mysql_connect("192.168.0.1","admin","admin")
or die($this->error);
@mysql_select_db("door_server",$this->link);
@mysql_query("set autocommit=0");
}


    /*
    *
    * method   : release()
    * description : 释放数据库的连接
    * parameter   : 已连接的数据库标识
    * return   : 成功返回true;失败返回false;
    *
    */

    function release(){
@$this->execute("commit");
return mysql_close($this->link);
    }


    /*
    *
    * method   : select($sql)
    * description : 取得记录集
    * parameter   : sql查询语句,数据库连接标识
    * return   : 返回类型:array 
    *               array中的每一个元素为mysql_fetch_object()得到的对象
    *
    */

    function select($sql){

  $i=0;
$array_result="";
//mysql_unbuffered_query 
    $db_result=mysql_unbuffered_query($sql,$this->link);
     if($db_result){
while($row=mysql_fetch_object($db_result)){
$array_result[$i] = $row;
$i++;
}
mysql_free_result($db_result);

     }else{
echo "<!--出错了:" . $sql."-->";
return false; 
     }
$this->manage_log($sql);
return $array_result;
    }


    
    
    /*
    *
    * method   : execute($sql)
    * description : 更新记录
    * parameter   : sql更新语句,数据库连接标识
    * return   : 返回类型:boolean 
    *
    */

    function execute($sql){
//$sql = str_replace("\\","\\\\",$sql);
     $result=mysql_query($sql,$this->link);
     if(!$result){
     echo "<!--出错了:" . $sql."-->";
     return false;
     }else{
$this->manage_log($sql);
     return true;
}
    }
   }
太长了,只贴到这里

#16




mysql_unbuffered_query
(PHP 4 >= 4.0.6)

mysql_unbuffered_query --  向 MySQL 发送一条 SQL 查询,并不获取和缓存结果的行 
说明
resource mysql_unbuffered_query ( string query [, resource link_identifier])


mysql_unbuffered_query() 向 MySQL 发送一条 SQL 查询 query,但不像 mysql_query() 那样自动获取并缓存结果集。一方面,这在处理很大的结果集时会节省可观的内存。另一方面,可以在获取第一行后立即对结果集进行操作,而不用等到整个 SQL 语句都执行完毕。当使用多个数据库连接时,必须指定可选参数 link_identifier。 

注: mysql_unbuffered_query() 的好处是有代价的:在 mysql_unbuffered_query() 返回的结果集之上不能使用 mysql_num_rows() 和 mysql_data_seek()。此外在向 MySQL 发送一条新的 SQL 查询之前,必须提取掉所有未缓存的 SQL 查询所产生的结果行。 

参见 mysql_query()。