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。