深入探討:PHP使用資料庫永久串連方式操作MySQL的是與非

來源:互聯網
上載者:User

PHP程式員應該都知道串連MySQL資料庫可以使用mysql_pconnect(永久串連)函數,使用資料庫永久串連可以提高效率,但是實際應用中資料庫永久串連往往會導致出現一些問題,通常的表現就是在大訪問量的網站上時常發生斷斷續續的無法串連資料庫的情況,出現類似"Too many connections in ..."的錯誤提示資訊,重新啟動伺服器又正常了,但過不了一會兒又出現同樣的故障。對於這些問題的成因,恐怕就不是每個人都能說清楚的了,雖然PHP文檔裡有一些相關資料,但是解釋的並不淺顯易懂,這裡我厚著臉皮試圖做一個簡單的討論,所述觀點不見得全都正確,歡迎大家反饋意見。

首先看看資料庫永久串連的定義:
永久的資料庫連接是指在指令碼結束運行時不關閉的串連。當收到一個永久串連的請求時。PHP 將檢查是否已經存在一個(前面已經開啟的)相同的永久串連。如果存在,將直接使用這個串連;如果不存在,則建立一個新的串連。所謂“相同”的串連是指用相同的使用者名稱和密碼到相同主機的串連。

PHP使用永久串連方式操作MySQL是有前提的:就是PHP必須安裝為多線程或多進程Web伺服器的外掛程式或模組。最常見的形式是把PHP用作多進程Apache伺服器的一個模組。對於一個多進程的伺服器,其典型特徵是有一個父進程和一組子進程協調運行,其中實際產生Web頁面的是子進程。每當用戶端向父進程提出請求時,該請求會被傳遞給還沒有被其它的用戶端請求佔用的子進程。這也就是說當相同的用戶端第二次向服務端提出請求時,它將有可能被一個不同的子進程來處理。在開啟了一個永久串連後,所有不同子進程請求SQL服務的後繼頁面都能夠重新使用這個已經建立的 SQL伺服器串連。它使得每個子進程在其生命週期中只做一次串連操作,而非每次在處理一個頁面時都要向 SQL 伺服器提出串連請求。每個子進程將對伺服器建立各自獨立的永久串連。PHP本身並沒有資料庫連接池的概念,但是Apache有進程池的概念, 一個Apache子進程結束後會被放回進程池, 這也就使得用mysql_pconnect開啟的的那個mysql串連資源可以不被釋放,而是依附在相應的Apache子進程上儲存到了進程池中。於是在下一個串連請求時它就可以被複用。一切看起來似乎都很正常,但是在Apache並發訪問量大的時候,如果使用mysql_pconnect,會由於之前的 Apache子進程佔用的MySQL串連沒有close, 很快使MySQL達到最大串連數,使得之後的請求可能得不到響應。

上面的部分文字是摘抄自PHP文檔,看起來可能還是有些文縐縐的不好理解,那麼我就用大白話再舉一個例子來說明問題:

假設Apache配置最大串連數為1000,MySQL配置最大串連數為100,當Apache伺服器接到200個並發訪問的時候,其中100個涉及到資料庫訪問,剩下的100個不涉及資料庫訪問,因為這個時候還不存在可用的資料庫連接,所以這裡面涉及到資料庫訪問的100個並發會同時產生100個資料庫永久串連,達到了資料庫最大串連數,當這些操作沒有結束的時候,任何其他的串連都無法再獲得資料庫連接,當這些操作結束了,相應的串連會被放入進程池,此時Apache的進程池裡就有了200個閒置子進程,其中100個是帶有資料庫連接的,由於Apache會為訪問請求隨機的挑選空閑子進程,所以你得到的子進程很可能是不包含資料庫連接的那100個中的一個,而資料庫連接已經達到了最大值,你也不可能成功的建立新的資料庫連接,唉,你便只好不停的重新整理頁面,哪個時候運氣好,碰巧分配到了帶有資料庫連接的子進程,才能正常瀏覽頁面。如果是大訪問量的網站來說,任何時候都可能存在大量的並發,所以瀏覽者可能就會不停的發現無法串連資料庫的現象了。

或許你會說,我們把Apache和MySQL的最大串連數調成一樣大不就可以了嗎?是的,合理的調整這個最大串連數某種程度上會避免這個問題的發生,但是Apache和MySQL的負載能力是不同的,如果按照Apache的負載能力來設定,對於MySQL來說,這個最大串連數就偏大,會產生大量的 MySQL資料庫永久串連,打個比方,就好像和平時代還要養活一個幾百萬的軍隊一樣,其開銷得不償失;而如果按照Mysql的負載能力設定,對於 Apache來說,這個最大串連數就偏小,有點殺雞牛刀的感覺,無法發揮Apache的最大效率。

所以按照PHP手冊上的介紹,只適合在並發訪問不大的網站上使用資料庫永久串連,但對於一個並發訪問不大的網站來說,使用資料庫永久串連帶來的效率提高似乎沒有太大的意義,從這個角度上來看,我覺得PHP中的資料庫永久串連基本上是一個雞肋的角色,如果你一定要使用資料庫連接池的概念,可以嘗試一下sqlrelay或者Apache本身提供的mod_dbd,說不定會有驚喜。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.