首頁  >  文章  >  後端開發  >  PHP怎麼連接資料庫效率高?

PHP怎麼連接資料庫效率高?

巴扎黑
巴扎黑原創
2016-11-12 10:30:231033瀏覽

整理的一個在phpchina的一個問題:
1.用mysql_connect()函數建立一個單例類,比如:

[code=PHP]class DB
{
        private static $db=NULL;        
        private        function __construct()
        {
                ;
        }
        public static function conn()
        {
                if(self::$db==NULL)        
                {
                        self::$db=mysql_connect('localhost','root','****');
                }
                return self::$db;
        }[/code]

2.直接使用pconnect長連接
3.建立一個資料庫操作類,構建實例的時候連接資料庫,銷毀的時候關閉連接(mysql_close)
4.優先採用長連接PHP代碼

[code="PHP"]if(mysql_pconnect())
{
     $conn=mysql_pconnect();
}else{
   $conn=mysql_connect();
}

[/code]以上四個方式採用哪個性能高?或者針對不同的並發情況,什麼場景使用什麼連接較好?

有人回答如下:

在php層面,無論你怎麼寫程式碼,都是半斤八兩,沒啥區別。我來強調下長連接和普通連結的差異:
    永久連結並不是說,伺服器打開了一個連接,然後所有的人都共享這個連結。永久連接一樣是每個客戶端來就打開一個連接,有200人訪問就有200個連接。其實mysql_pconnect()本身並沒有做太多的處理, 它唯一做的只是在php運行結束後不主動close掉mysql的連接.
     在php經cgi方式運行時pconnect和connect是基本沒有區別的, 因為cgi方式是每一個php訪問起一個進程, 訪問結束後進程也就結束了, 資源也全釋放了. 當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
     當db操作複雜, 耗時較長時, 因httpd會fork很多並發進程處理, 而先產生的httpd進程不釋放db連接, 使得後產生的httpd進程無法連上db . 因為這樣沒有復用其它httpd進程的mysql連線. 於是會就產生很多連線逾時。 在同時訪問量不高時,使用pconnect可以簡單提高訪問速度, 但在並發量增大後, 是否再使用pconnect就要看程序員的選擇了.
     php對mysql的連接並沒有真正用到連接池, pconnect也只是相當於借了apache的進程池來用, 所以在並發訪問量大的時候pconnect並不能很好的提高訪問db效率. 
      在實際的應用中,用mysql_pconnect的話,每次刷新和請求新的頁面都比較快,而用mysql_connect的話,每次刷新都要重新請求,當資料庫連線比較慢的時候,就能看出差異了。當你的資料庫連線比較慢,DB操作不是很複雜,而且你對自己的程式夠自信,不會產生死鎖的時候,而且你對伺服器有控制權的話,滿足以上四個條件中的任意兩個,那麼就可以用pconnect。
pconnect不用在腳本裡關閉,可以在mysql中設定lifetime,也可以寫shell定期掃描,kill掉休眠過長的連線。 一句話總結:要用好pconnect,不只是php腳本的事 還關係到資料庫和伺服器的設定。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn