mysql_connect和mysql_pconnect的区别

php中mysql_pconnect()的实现方式:其实mysql_pconnect()自己并无作太多的处理,它惟一作的只是在php运行结束后不主动close掉mysql的链接。mysql_pconnect()与mysql_connect()的区别包括:   cgi方式下:在php经cgi方式运行时pconnect和connect是基本没有区别的,由于cgi方式是每个php访问起一个进程,访问结束后进程也就结束了,资源也全释放了。
  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_connect。
相关文章
相关标签/搜索