解析php中mysql_connect與mysql_pconncet的區(qū)別詳解
更新時間:2013年05月15日 17:21:40 作者:
本篇文章是對php中mysql_connect與mysql_pconncet的區(qū)別進行了分析介紹,需要的朋友參考下
說說mysql_connect與mysql_pconnect的區(qū)別,這倆函數(shù)用法上差不多,網(wǎng)上有說應(yīng)該用pconnect的,pconnect是個 好東西;也有視pconnect如洪水猛獸的,堅決不讓用pconnect的,也有態(tài)度曖昧不清的。那這個東西到底如何呢?
永久鏈接并不是說,服務(wù)器打開了一個連接,然后所有的人都共享這個鏈接。永久連接一樣是每個客戶端來就打開一個連接,有200人訪問就有200個連接。其 實mysql_pconnect()本身并沒有做太多的處理, 它唯一做的只是在php運行結(jié)束后不主動close掉mysql的連接.
在php經(jīng)cgi方式運行時pconnect和connect是基本沒有區(qū)別的, 因為cgi方式是每一個php訪問起一個進程, 訪問結(jié)束后進程也就結(jié)束了, 資源也全釋放了. 當(dāng)php以apache模塊方式運行時, 由于apache有使用進程池, 一個httpd進程結(jié)束后會被放回進程池, 這也就使得用pconnect打開的的那個mysql連接資源不被釋放, 于是有下一個連接請求時就可以被復(fù)用.這就使得在apache并發(fā)訪問量不大的時候, 由于使用了pconnect, php節(jié)省了反復(fù)連接db的時間, 使得訪問速度加快. 這應(yīng)該是比較好理解的. 但是在apache并發(fā)訪問量大的時候, 如果使用pconnect, 會由于之前的一些httpd進程占用的mysql連接沒有close, 則可能會因為mysql已經(jīng)達到最大連接著, 使得之后的一些請求永遠得不到滿足.若mysql最大連接數(shù)設(shè)為500, 而apache的最大同時訪問數(shù)設(shè)為2000,假設(shè)所有訪問都會要求訪問db, 而且操作時間會比較長,當(dāng)前500個請求的httpd都沒有結(jié)束的時候,之后的httd進程都是無法連接到mysql的(因已經(jīng)達到mysql最大連接 數(shù)). 只有當(dāng)前500個httpd進程結(jié)束或被復(fù)用才可以連接得到了mysql.
當(dāng)db操作復(fù)雜, 耗時較長時, 因httpd會fork很多并發(fā)進程處理, 而先產(chǎn)生的httpd進程不釋放db連接, 使得后產(chǎn)生的httpd進程無法連上db. 因為這樣沒有復(fù)用其它httpd進程的mysql連接. 于是會就產(chǎn)生很多連接超時。 在并發(fā)訪問量不高時,使用pconnect可以簡單提高訪問速度, 但在并發(fā)量增大后, 是否再使用pconnect就要看程序員的選擇了.
就我個人認為, php現(xiàn)在對mysql的連接并沒有真正用到連接池, pconnect也只是相當(dāng)于借了apache的進程池來用, 所以在并發(fā)訪問量大的時候pconnect并不能很好的提高訪問db效率.
在實際的應(yīng)用中,用mysql_pconnect的話,每次刷新和請求新的頁面都比較快,而用mysql_connect的話,每次刷新都要重新請求,當(dāng)數(shù)據(jù)庫連接比較慢的時候,就能看出差異了。當(dāng)你的數(shù)據(jù)庫連接比較慢,DB操作不是很復(fù)雜,并且你的程序足夠自信,不會產(chǎn)生死鎖的時候,或者你擁有對服務(wù)器的控制權(quán),滿足以上四個條件中的任意兩個,那就可以用pconnect。
pconnect不用在腳本里關(guān)閉,可以在mysql中設(shè)置lifetime,也可以寫shell定期掃描,kill掉休眠過長的連接。 一句話總結(jié):要用好pconnect,不僅僅是php腳本的事 還關(guān)系到數(shù)據(jù)庫和服務(wù)器的設(shè)置。
永久鏈接并不是說,服務(wù)器打開了一個連接,然后所有的人都共享這個鏈接。永久連接一樣是每個客戶端來就打開一個連接,有200人訪問就有200個連接。其 實mysql_pconnect()本身并沒有做太多的處理, 它唯一做的只是在php運行結(jié)束后不主動close掉mysql的連接.
在php經(jīng)cgi方式運行時pconnect和connect是基本沒有區(qū)別的, 因為cgi方式是每一個php訪問起一個進程, 訪問結(jié)束后進程也就結(jié)束了, 資源也全釋放了. 當(dāng)php以apache模塊方式運行時, 由于apache有使用進程池, 一個httpd進程結(jié)束后會被放回進程池, 這也就使得用pconnect打開的的那個mysql連接資源不被釋放, 于是有下一個連接請求時就可以被復(fù)用.這就使得在apache并發(fā)訪問量不大的時候, 由于使用了pconnect, php節(jié)省了反復(fù)連接db的時間, 使得訪問速度加快. 這應(yīng)該是比較好理解的. 但是在apache并發(fā)訪問量大的時候, 如果使用pconnect, 會由于之前的一些httpd進程占用的mysql連接沒有close, 則可能會因為mysql已經(jīng)達到最大連接著, 使得之后的一些請求永遠得不到滿足.若mysql最大連接數(shù)設(shè)為500, 而apache的最大同時訪問數(shù)設(shè)為2000,假設(shè)所有訪問都會要求訪問db, 而且操作時間會比較長,當(dāng)前500個請求的httpd都沒有結(jié)束的時候,之后的httd進程都是無法連接到mysql的(因已經(jīng)達到mysql最大連接 數(shù)). 只有當(dāng)前500個httpd進程結(jié)束或被復(fù)用才可以連接得到了mysql.
當(dāng)db操作復(fù)雜, 耗時較長時, 因httpd會fork很多并發(fā)進程處理, 而先產(chǎn)生的httpd進程不釋放db連接, 使得后產(chǎn)生的httpd進程無法連上db. 因為這樣沒有復(fù)用其它httpd進程的mysql連接. 于是會就產(chǎn)生很多連接超時。 在并發(fā)訪問量不高時,使用pconnect可以簡單提高訪問速度, 但在并發(fā)量增大后, 是否再使用pconnect就要看程序員的選擇了.
就我個人認為, php現(xiàn)在對mysql的連接并沒有真正用到連接池, pconnect也只是相當(dāng)于借了apache的進程池來用, 所以在并發(fā)訪問量大的時候pconnect并不能很好的提高訪問db效率.
在實際的應(yīng)用中,用mysql_pconnect的話,每次刷新和請求新的頁面都比較快,而用mysql_connect的話,每次刷新都要重新請求,當(dāng)數(shù)據(jù)庫連接比較慢的時候,就能看出差異了。當(dāng)你的數(shù)據(jù)庫連接比較慢,DB操作不是很復(fù)雜,并且你的程序足夠自信,不會產(chǎn)生死鎖的時候,或者你擁有對服務(wù)器的控制權(quán),滿足以上四個條件中的任意兩個,那就可以用pconnect。
pconnect不用在腳本里關(guān)閉,可以在mysql中設(shè)置lifetime,也可以寫shell定期掃描,kill掉休眠過長的連接。 一句話總結(jié):要用好pconnect,不僅僅是php腳本的事 還關(guān)系到數(shù)據(jù)庫和服務(wù)器的設(shè)置。
相關(guān)文章
Laravel 5 框架入門(二)構(gòu)建 Pages 的管理功能
這篇文章主要介紹了Laravel 5 框架入門的第二篇文章,給大家講解的是構(gòu)建 Pages 的管理功能,十分的詳細,有需要的小伙伴可以參考下。2015-04-04thinkphp3.2中Lite文件替換框架入口文件或應(yīng)用入口文件的方法
這篇文章主要介紹了thinkphp3.2中Lite文件替換框架入口文件或應(yīng)用入口文件的方法,涉及ThinkPHP相關(guān)配置技巧,需要的朋友可以參考下2015-05-05php中curl和soap方式請求服務(wù)超時問題的解決
本篇文章主要介紹了php中curl和soap方式請求服務(wù)超時問題的解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06基于ubuntu下nginx+php+mysql安裝配置的具體操作步驟
本篇文章介紹了,基于ubuntu下nginx+php+mysql安裝配置的具體操作步驟。需要的朋友參考下2013-04-04PHP SPL標準庫之?dāng)?shù)據(jù)結(jié)構(gòu)棧(SplStack)介紹
這篇文章主要介紹了PHP SPL標準庫之?dāng)?shù)據(jù)結(jié)構(gòu)棧(SplStack)介紹,棧(Stack)是一種特殊的線性表,因為它只能在線性表的一端進行插入或刪除元素(即進棧和出棧),需要的朋友可以參考下2015-05-05