请各位来谈谈php连接数据库方式……它们之间有什么优缺点?

持久连接和普通的连接这两种方式的区别众所周知,
可是它们之间有什么优缺点吗???

比如那个性能更好些??……
---------------------------------------------------------------

人少,就用pconn,人多,还是用conn

理论是这样吧
---------------------------------------------------------------

一般情况下都建议用mysql_pconnecct()

如果有很多通过不同的用户名和密码联结mysql的话,可以考虑用mysql_connect。因为mysql_connect可以关闭

楼上楼上的:
说明你们公司的前辈可能不精通php

---------------------------------------------------------------

在这里我解释以下普通连接和永久连接
普通连接就是我们每一次操作数据库,都重新建立连接。
永久连接是当我们第一次建立连接后,再次操作数据库时,将首先检测是否已经有了连接,如果有,不建立直接调用第一次建立的。
这样我认为,对于写程序经常忘记关闭连接的应当有好处。
---------------------------------------------------------------

在PHP的source code中,你会发现php自身会有一个大的memory,它会把每次的
mysql连接资源防到其中,如果你用pconnect,其实就是每次连接,它都会到这个
连接池中去找有没有可用的连接,如果没有找到,它就新开一个,
如果已经有人用过的可用连接,pconnect就不会再创建新连接了,而直接用这个可用的连接了.
如果你用connect,则你必须自己负责创建和销毁连接了.
其实综合看起来,如果大家都用pconnect,是一种比较好的形式.
---------------------------------------------------------------

mysql_connect: 脚本执行结束时,自动 close,而使用 mysql_close 是为了在脚本结束前提前 close, 所以一般用不着 mysql_close

mysql_pconnect: 执行时首先寻找一个已经打开的连接,若存在就直接使用,否则才创建一个新的连接

用 mysql_pconnect 较好,因为省略了很多重复的 close/connect 操作,速度可能更快。
连接数与人多人少无关,当有 N 个人连接时,不论用 pconnect 还是 connect,最多都只有 N 个连接。

只有在一种情形下,connect 优于 pconnect:

你的脚本要执行很长时间 T1,其中只有开始的一小段时间 T2 需要用到数据库。这样,如果用 connect,而且用完后立即 close,则从总体上会减少数据库连接数。因为 pconnect 建立的连接,只有当脚本结束后才能标记为“空闲”,也只有标记为“空闲”的连接,才能被下一个脚本使用。

如果同时运行的脚本数巨多,而且所有的脚本都一样,那么可以有一个近似公式:

NC / NS = T2 / T1

其中 NC 是总连接数,NS 是总脚本数。可见,时间比例被等效成了数量的比例。

假如 T2 = T1 * 0.1,那么近似有

NC = NS * 0.1

效果明显!

问题是:这种情况好像很少见。

---------------------------------------------------------------

  1   
  2class sql_db   
  3{   
  4  
  5var $db_connect_id;   
  6var $query_result;   
  7var $row = array();   
  8var $rowset = array();   
  9var $num_queries = 0;   
 10  
 11//   
 12// Constructor   
 13//   
 14function sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true)   
 15{   
 16  
 17$this->persistency = $persistency;   
 18$this->user = $sqluser;   
 19$this->password = $sqlpassword;   
 20$this->server = $sqlserver;   
 21$this->dbname = $database;   
 22  
 23if($this->persistency)   
 24{   
 25$this->db_connect_id = @mysql_pconnect($this->server, $this->user, $this->password);   
 26}   
 27else   
 28{   
 29$this->db_connect_id = @mysql_connect($this->server, $this->user, $this->password);   
 30}   
 31if($this->db_connect_id)   
 32{   
 33if($database != "")   
 34{   
 35$this->dbname = $database;   
 36$dbselect = @mysql_select_db($this->dbname);   
 37if(!$dbselect)   
 38{   
 39@mysql_close($this->db_connect_id);   
 40$this->db_connect_id = $dbselect;   
 41}   
 42}   
 43return $this->db_connect_id;   
 44}   
 45else   
 46{   
 47return false;   
 48}   
 49}   
 50  
 51//   
 52// Other base methods   
 53//   
 54function sql_close()   
 55{   
 56if($this->db_connect_id)   
 57{   
 58if($this->query_result)   
 59{   
 60@mysql_free_result($this->query_result);   
 61}   
 62$result = @mysql_close($this->db_connect_id);   
 63return $result;   
 64}   
 65else   
 66{   
 67return false;   
 68}   
 69}   
 70  
 71//   
 72// Base query method   
 73//   
 74function sql_query($query = "", $transaction = FALSE)   
 75{   
 76// Remove any pre-existing queries   
 77unset($this->query_result);   
 78if($query != "")   
 79{   
 80$this->num_queries++;   
 81  
 82$this->query_result = @mysql_query($query, $this->db_connect_id);   
 83}   
 84if($this->query_result)   
 85{   
 86unset($this->row[$this->query_result]);   
 87unset($this->rowset[$this->query_result]);   
 88return $this->query_result;   
 89}   
 90else   
 91{   
 92return ( $transaction == END_TRANSACTION ) ? true : false;   
 93}   
 94}   
 95  
 96//   
 97// Other query methods   
 98//   
 99function sql_numrows($query_id = 0)   
100{   
101if(!$query_id)   
102{   
103$query_id = $this->query_result;   
104}   
105if($query_id)   
106{   
107$result = @mysql_num_rows($query_id);   
108return $result;   
109}   
110else   
111{   
112return false;   
113}   
114}   
115function sql_affectedrows()   
116{   
117if($this->db_connect_id)   
118{   
119$result = @mysql_affected_rows($this->db_connect_id);   
120return $result;   
121}   
122else   
123{   
124return false;   
125}   
126}   
127function sql_numfields($query_id = 0)   
128{   
129if(!$query_id)   
130{   
131$query_id = $this->query_result;   
132}   
133if($query_id)   
134{   
135$result = @mysql_num_fields($query_id);   
136return $result;   
137}   
138else   
139{   
140return false;   
141}   
142}   
143function sql_fieldname($offset, $query_id = 0)   
144{   
145if(!$query_id)   
146{   
147$query_id = $this->query_result;   
148}   
149if($query_id)   
150{   
151$result = @mysql_field_name($query_id, $offset);   
152return $result;   
153}   
154else   
155{   
156return false;   
157}   
158}   
159function sql_fieldtype($offset, $query_id = 0)   
160{   
161if(!$query_id)   
162{   
163$query_id = $this->query_result;   
164}   
165if($query_id)   
166{   
167$result = @mysql_field_type($query_id, $offset);   
168return $result;   
169}   
170else   
171{   
172return false;   
173}   
174}   
175function sql_fetchrow($query_id = 0)   
176{   
177if(!$query_id)   
178{   
179$query_id = $this->query_result;   
180}   
181if($query_id)   
182{   
183$this->row[$query_id] = @mysql_fetch_array($query_id);   
184return $this->row[$query_id];   
185}   
186else   
187{   
188return false;   
189}   
190}   
191function sql_fetchrowset($query_id = 0)   
192{   
193if(!$query_id)   
194{   
195$query_id = $this->query_result;   
196}   
197if($query_id)   
198{   
199unset($this->rowset[$query_id]);   
200unset($this->row[$query_id]);   
201while($this->rowset[$query_id] = @mysql_fetch_array($query_id))   
202{   
203$result[] = $this->rowset[$query_id];   
204}   
205return $result;   
206}   
207else   
208{   
209return false;   
210}   
211}   
212function sql_fetchfield($field, $rownum = -1, $query_id = 0)   
213{   
214if(!$query_id)   
215{   
216$query_id = $this->query_result;   
217}   
218if($query_id)   
219{   
220if($rownum > -1)   
221{   
222$result = @mysql_result($query_id, $rownum, $field);   
223}   
224else   
225{   
226if(empty($this->row[$query_id]) && empty($this->rowset[$query_id]))   
227{   
228if($this->sql_fetchrow())   
229{   
230$result = $this->row[$query_id][$field];   
231}   
232}   
233else   
234{   
235if($this->rowset[$query_id])   
236{   
237$result = $this->rowset[$query_id][$field];   
238}   
239else if($this->row[$query_id])   
240{   
241$result = $this->row[$query_id][$field];   
242}   
243}   
244}   
245return $result;   
246}   
247else   
248{   
249return false;   
250}   
251}   
252function sql_rowseek($rownum, $query_id = 0){   
253if(!$query_id)   
254{   
255$query_id = $this->query_result;   
256}   
257if($query_id)   
258{   
259$result = @mysql_data_seek($query_id, $rownum);   
260return $result;   
261}   
262else   
263{   
264return false;   
265}   
266}   
267function sql_nextid(){   
268if($this->db_connect_id)   
269{   
270$result = @mysql_insert_id($this->db_connect_id);   
271return $result;   
272}   
273else   
274{   
275return false;   
276}   
277}   
278function sql_freeresult($query_id = 0){   
279if(!$query_id)   
280{   
281$query_id = $this->query_result;   
282}   
283  
284if ( $query_id )   
285{   
286unset($this->row[$query_id]);   
287unset($this->rowset[$query_id]);   
288  
289@mysql_free_result($query_id);   
290  
291return true;   
292}   
293else   
294{   
295return false;   
296}   
297}   
298function sql_error($query_id = 0)   
299{   
300$result["message"] = @mysql_error($this->db_connect_id);   
301$result["code"] = @mysql_errno($this->db_connect_id);   
302  
303return $result;   
304}   
305  
306} // class sql_db   
307  
308} // if ... define   
309  

---------------------------------------------------------------

除非你很必要,否则不要用“永久连接”,尽量使用页面范围的连接,而不要使用会话和应用程序范围的连接方式。这个讨论在javascript也有一个,参考一下,

Published At
Categories with Web编程
comments powered by Disqus