connect:mysql_connect 和 mysql_pconnect



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
Tags:  connect

延伸阅读

最新评论

发表评论