+ -
当前位置:首页 → 问答吧 → 咨询PHP如何做到不用每次打开数据库问题?

咨询PHP如何做到不用每次打开数据库问题?

时间:2011-09-08

来源:互联网

我想做到,一个客户端连接来了, PHP不用每次都去connect mysql数据库,这样开销很大,
而是在某个地方取得一个DB的连接句柄就行了,
因为客户端连接也比较多,如何来做到呢?

作者: e_job   发布时间: 2011-09-08

php会自动释放资源的。完全可以不这么弄吧(我的理解),坐得高手

作者: yunprince   发布时间: 2011-09-08

mysql_pconnect() 这种数据连接的缓冲不是我想要的,从介绍看不太可靠。
PHP提供了一种内置的数据库缓冲机制,即用mysql_pconnect()代替mysql_connect() 来打开数据库而已。PHP会自动回收被废弃的数据库连接,以供重复使用。在实际应用中,这种持久性数据库连接往往会导致数据库连接的伪泄漏现象:在某个时间,并发的数据库连接过多,超过了MySQL的最大连接数,从而导致新的进程无法连接数据库。但是过一段时间,当并发数减少时,PHP会释放掉一些连接,网站又会恢复正常。

作者: e_job   发布时间: 2011-09-08

楼主理解错了,你得到句柄没用,你看过的这类的都是单入口模式,也是每次都需要connect的或者pconnect的

作者: kyzy_yy_pm   发布时间: 2011-09-08

a.php
mysql_connect()

b.php
include("a.pohp")
mysql_query('select ...');

作者: kyzy_yy_pm   发布时间: 2011-09-08

php链接数据库不是有个长链接嘛.问题是如果不是非常频繁的链接数据库使用长链接的开销更大...而且你的是一个新的客户端.那么即使是长链接它还是要开始一个初始的链接..

现在的链接它会自动释放,开销不大的,其实该优化的是你的数据结构SQL...

作者: PhpNewnew   发布时间: 2011-09-08

mysql_pconnect()也没用,每个用户连接上,就会连到到数据库。每个用户的句柄是独立的。

作者: NET920   发布时间: 2011-09-08

mysql_pconnect可以放心用的,但至少需要设置wait_timeout
PHP code

mysql_query("set wait_timeout=600"); 
//600秒之内没有交互则自动断掉连接,这点可以通过show processlist来验证

作者: fenyao   发布时间: 2011-09-08

mysql_pconnect() 是针对每个客户端的吗,,不是针对(进程,用户名,密码)的吗?
我理解是同一个进程,用户名,密码下调用就会是找同一个已经连接上的。

作者: e_job   发布时间: 2011-09-08

第一、只是连接开销其实不会很大,开销最大的是查询操作,所以写SQL的时候控制一下查询的字段,用到什么查什么,在不必要的情况下尽量不要使用“SELECT *”,而且要多加一些控制条数的语句,尤其是做新闻网站,查询新闻内容的时候。再就是你用MYSQL数据库,访问量也不会很大。所以控制好查询,才是最实际的。
第二、只要查数据就要对数据库进行操作,不过你也可以写一些缓存文件,这样的的话就可以把一些内容写到本地。
第三、数据库连接和查询是有一个临界点的,不是说查询少量多次的查询内容,或者一次查询大量内容,就可以减少或者增加服务端压力的。而是要取得一个临界值,把握好一个度才是最重要的。

作者: c36657598   发布时间: 2011-09-08

引用 8 楼 e_job 的回复:

mysql_pconnect() 是针对每个客户端的吗,,不是针对(进程,用户名,密码)的吗?
我理解是同一个进程,用户名,密码下调用就会是找同一个已经连接上的。


同个进程.

作者: PhpNewnew   发布时间: 2011-09-08

这问题很是让人纠结:
Apache+PHP+Mysql_pconnect的工作方式
每当客户端向服务端发送一个连接请求(包括图片,HTML,PHP等),apache将会用一个线程来接受这个请求(换句话说,每一个用户访问,就占用一个线程),如果是请求的是一个PHP文件,且 PHP文件里使用了PConnect,则当前线程会判断当前线程有没有打开过pconnect(每个用户的线程是相互独立的,那么pconnect也就是针对当前用户占用的进程而言的),如果有打开过,则使用原来的mysql connect,如果没有打开过,则新建一个connect,并且,连接断开后,线程仍在运行,而且保持Mysql connect.按这种方式运行一段时间后,完全有可能所有apache的线程都打开过有Pconnect的Php页面,所以,如果apache的 ThreadsPerChild=500的话,则500个线程都找开了mysql连接,并且没有关闭,则就要求,mysql的连接数必须大于或等于 500,如果小于这个值,将会导致PHP页面提示数据库连接失败.

作者: NET920   发布时间: 2011-09-08

pconnect还是针对每个客户进程的。不是所有客户都共用同一个进程。

作者: NET920   发布时间: 2011-09-08

注意,如果永久连接的子过程数目超过了您设定的数据库连接数限制,系统将会产生一些缺陷。如果您的数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在您的脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速的受到影响。

如果所有的用户连接请求都只占用一个持久链接线程,那打个比方,100万用户访问这一个网站,对数据库进行操作,只占用一个数据库线程??

作者: NET920   发布时间: 2011-09-08

相关阅读 更多