大家请看我写的类会造成数据库资源耗尽么? 没有。网页关闭,服务进程也会关。自然Myql也关闭。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 $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(); 如果这样写访问量大一些的话可能会挂掉(个人认为)每次new一个DB都应该会产生一个数据库连接个人认为如果所有用户共享一个数据库连接,或者不同类型的用户共享一个连接比较好(比如电影版的用户共享一个连接,电视版用户共享一个连接)刚学PHP不久,仅供参考,说错了可不要笑话我:) 用 ADODB 好了。没有必要每个人都自己写个 DB类 我个人觉得是APACHE 中 PHP内存设定的问题。你这么做,没有limit的情况下,在大数据量的情况下,PHP吃内存的情况非常严重。我测试过,在PHP内存为8MB,对300个记录进行各种判断,存入数组等等各种操作的情况下就已经是非常严重了。 严重关注这个问题!请教各位几个上面解答中的疑惑:1、mysql_free_result这个方法有必要么?(程序在毫秒计的时间内运行完毕后马上就自动释放了吧)2、共享mysql连接,这个怎样实现?怎样让b用户使用a用户开启的长连接?3、我想这个和类本身没有关系。但是区区几十条记录,怎么会导致服务器的mysql频繁当?而不是apache?4、有些时候要选择数据表的总记录数,必须进行无limit的简单查询,这样吃内存严重?怎么办?5、存入数组和300个记录判断造成严重吃内存是指往哪里? 我以前也发现pear DB函数经常把mysql挂了后来我重新写过DB类才行。mysql释放不了资源至今不懂是什么问题造成的 不会啊。网页关闭,连接也关闭。长连接就不知道了。但不可能在php平台层面上实现a用户资源给b用户。除非你在自己的程序里建立对应的缓冲机制(也就是应用层)查询总记录数,可以 select 其中一个小的字段吧?不必要 *300个记录应该不算什么吧。看你的数据是怎样了。和存的方法。 我是在国外申请的空间和服务器,网站经常突然down掉(就是数据库的问题,因为访问静态网页可以), 联系了管理员,他们让我检查我的程序是否在结尾没有关闭数据库,我检查了,开始确实这样,后来关闭了,但是偶尔还会发生, 后来他们说页可能是其他客户的问题,因为我们都是共享的mysql,如果他们的程序有问题,我的也会牵连进去....55555. select *要比select id快。mysql优化上是这么写的。 从来没有用过 mysql_close,呵呵。。“select *要比select id快。”单单指在mysql数据库中查询速度,并不代表整体速度。呵呵,还有其他因素的,如果web与数据库不在一台机器上,网络速度影响也很大,尤其*里面有很多东东的时候,呵呵。再说,消耗资源也不小,还是全程的消耗。呵呵另外,lz,现在有很多现成的数据库操作类,拿来看看就知道很多问题:) mysql_free_result mysql_close()都必须有....得到记录集马上断开连接...我的DB类...共享一下..写得不算好,但从来没有挂过服务器 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; } } }太长了,只贴到这里 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()。 成为php编程高手的四条指... 真是搞不明白,PHP调用DLL库的问题 如何获取一个跳转网站的网址? 本地测试没问题,可上传到空间后js不管用了! 请问为什么include一个类文件就会影响其它的网页样式等问题 SOAP - wsdl 开发问题 类里include一个数组,在静态方法里无法使用吗 php用mail()可以发邮件,但怎么通过网页来收邮件? session_destroy()为什么不行呀?在线等待!...... 各位大哥:怎样才能将访问我网页的人的IP及url记录下来? PHP里$_POST是什么意思啊?? 奇怪的excel问题
$mydb->Connect();
$res = $mydb->query($sql);while ( $myrow = mysql_fetch_array($res) {
echo $myrow["id"]}
mysql_free_result($res); //自己写相应的方法 //你应该检查多方面检查。$mydb->close();
每次new一个DB都应该会产生一个数据库连接
个人认为如果所有用户共享一个数据库连接,
或者不同类型的用户共享一个连接比较好(比如电影版的用户共享一个连接,电视版用户共享一个连接)刚学PHP不久,仅供参考,说错了可不要笑话我:)
后来我重新写过DB类才行。
mysql释放不了资源
至今不懂是什么问题造成的
查询总记录数,可以 select 其中一个小的字段吧?不必要 *
300个记录应该不算什么吧。看你的数据是怎样了。和存的方法。
单单指在mysql数据库中查询速度,并不代表整体速度。呵呵,还有其他因素的,如果web与数据库不在一台机器上,网络速度影响也很大,尤其*里面有很多东东的时候,呵呵。再说,消耗资源也不小,还是全程的消耗。呵呵
另外,lz,现在有很多现成的数据库操作类,拿来看看就知道很多问题:)
得到记录集马上断开连接...我的DB类...共享一下..写得不算好,但从来没有挂过服务器
{
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;
}
}
}
太长了,只贴到这里
(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()。