教程集 www.jiaochengji.com
教程集 >  数据库  >  mysql  >  正文 php中连接mysql函数mysql_connect与mysql_pconnect对比

php中连接mysql函数mysql_connect与mysql_pconnect对比

发布时间:2023-04-29   编辑:jiaochengji.com
教程集为您提供php中连接mysql函数mysql,connect与mysql,pconnect对比等资源,欢迎您收藏本站,我们将为您提供最新的php中连接mysql函数mysql,connect与mysql,pconnect对比资源
mysql_connect与mysql_pconnect函数在php中都是用来连接数据库的,一个长连接一个短连接了,那么它们区别在哪里?下面一起来看看。

当需要使用PHP连接MySQL数据库的时候,会发现有两种数据库连接函数:mysql_connect()和mysql_pconnect()。

1、mysql_connect()

在脚本开始的时候,mysql_connect()会创建一个新的连接,脚本结束的时候就会关闭连接。脚本每一次执行,它都会创建一个新的连接。

2、mysql_pconnect()

当使用mysql_pconnect()连接数据库时,它首先会判断是否已经存在了数据库连接,如果存在,就会利用先用的资源ID,反之,就会创建一个新的连接。

在创建连接之后,函数返回资源ID(如果有)。当脚本再次调用的时候,它并不会创建新的连接。当然,脚本结束的时候,也不会关闭连接。这称之为持久连接。

但是,使用mysql_pconnect()时,需要对服务器配置做一下微调,譬如限制连接数,超时连接,以及处理空连接等。

3、怎么使用这两个函数


如果你的应用有很大流量,应该使用mysql_pconnect()函数,反之考虑mysql_connect()函数。

如果PHP和MySQL在同一台服务器上或者在本地网络,连接次数是可以忽略的,因为无论在哪种情况之下,持久连接都没有优势可言。

4、使用mysql_pconnect()应该留意的事

一般来说,当你锁定一个表时,连接关闭之后是就自动解锁了。但由于持久连接不关闭,任何你不小心锁定的表仍然会保持锁定的状态,唯一解锁的办法就是等待连接超时或者手动杀死进程。在进行事物处理时也会造成这个问题。

同样,临时表在连接关闭之后也会被删除。但由于持久连接不关闭,临时表就不再是临时表了。如果你完成需求后不删除临时表,它将作为一个新的客户端连接,并且是对于同一个连接。在设置Session变量的时候,会造成同样的问题。

在Apache上使用持久连接的效果并不会很好。当Apache收到客户端的一个请求时,会打开一个新的数据库连接,而不是利用已经存在持久连接去打开数据库,这将导致很多空闲进程、浪费资源,当达到最大连接数时,还是造成未知错误。


假设mysql服务器被配置为最大支持10个并发. 而apache被配置为使用100个子进程.

apache由一个父进程来协调将收到的http request分发给哪个空闲中的子进程处理,  这样很快处理了10个http请求, 假设10个都分配给了不同的子进程, 那末10条跟mysql间的持久连接就建立了, mysql的能力已经到了极限.

这时又来了一个http请求, apache将它分给其他的任意不在这10个子进程中的进程, 那末这个进程就没有办法建立到mysql的连接了, 因为坑位已经满了.


使用持久连接还会有其他方面的问题.


如果在你脚本中使用了持久连接, 又进行了锁表操作的话,  如果到脚本结束也没有去解锁的话.  那么下次再运行这个脚本的话, 它为了获得lock table会在那里无尽地等待过去的它unlock table, 过去的它已经不能回来了, 这里成了个死循环. 除非重启web或者mysql服务器. 另一个会造成锁定的就是事务了.

apache模块方式下:

区别在于当php以apache模块方式运行时, 由于apache有使用进程池, 一个httpd进程结束后会被放回进程池, 这也就使得用pconnect打开的的那个mysql连接资源不被释放, 于是有下一个连接请求时就可以被复用.

这就使得在apache并发访问量不大的时候, 由于使用了pconnect, php节省了反复连接db的时间, 使得访问速度加快. 这应该是比较好理解的.

但是在apache并发访问量大的时候, 如果使用pconnect, 会由于之前的一些httpd进程占用的mysql连接没有close, 则可能会因为mysql已经达到最大连接着, 使得之后的一些请求永远得不到满足.

例如:
若mysql最大连接数设为500, 而apache的最大同时访问数设为2000
假设所有访问都会要求访问db, 而且操作时间会比较长

当前500个请求的httpd都没有结束的时候...之后的httd进程都是无法连接到mysql的(因已经达到mysql最大连接数). 只有当前500个httpd进程结束或被复用才可以连接得到了mysql.

其实这个也很好解释了xgy_p的测试中若操作比较简单, pconnect比connect效率高很多, 而且跟使用jsp的连接池的速度比较接近. 因为这个时候httpd进程可以不断的给复用.

而 当DB操作复杂, 耗时较长时, 因httpd会fork很多并发进程处理, 而先产生的httpd进程不释放db连接, 使得后产生的httpd进程无法连上db. 因为这样没有复用其它httpd进程的mysql连接. 于是会就产生很多连接超时, 像一开始的1000个并发连接测试说几乎都是连接超时就是这个原因.

---
(反进来看jsp用的如果是纯粹的db连接池, 则不会有因为达到mysql连接上限而连不上的问题, 因为jsp的连接池会使得可以等待其它连接使用完毕并复用. )


因此在并发访问量不高时,使用pconnect可以简单提高访问速度, 但在并发量增大后, 是否再使用pconnect就要看程序员的选择了..

就我个人认为, php现在对mysql的连接并没有真正用到连接池, pconnect也只是相当于借了apache的进程池来用, 所以在并发访问量大的时候pconnect并不能很好的提高访问DB效率. 在这一点上. php的确比不上jsp

您可能感兴趣的文章:
有关mysql_pconnect()函数的理解
php中mysql_connect与mysql_pconncet的用法区别
php中执行mysql查询的步骤与方法
php持久连接mysql_pconnect用法举例
mysql_connect提示"No such file or directory"错误"
php连接数据库标准代码
php中连接数据库的方法是什么?
MySQL server has gone away问题的解决办法
十天学会php之第四天
php MySQL连接测试

[关闭]
~ ~