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. 

若操做比較簡單, 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的確比不上jspphp

相關文章
相關標籤/搜索