天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

深入探討:PHP使用數據庫永久連接方式操作MySQL的是與非

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,說不定會有驚喜。

php技術深入探討:PHP使用數據庫永久連接方式操作MySQL的是與非,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 岛国大片在线观看免费版 | 亚洲性夜夜色综合网站 | 秀婷程仪公欲息肉婷在线观看 | 国产亚洲精品品视频在线 | 火影忍者高清无码黄漫 | 日韩精品欧美亚洲高清有无 | 免费啪视频观试看视频 | 国产精品久久久久久久久久久 | 在线观看亚洲免费视频 | aaaaaa级特色特黄的毛片 | 男生脱美女内裤内衣动态图 | 欧美xxxxxbb| 双性将军粗壮H灌满怀孕 | sihu国产精品永久免费 | 荡公乱妇HD中文字幕 | 91九色精品国产免费 | 国内精品偷拍在线观看 | 天天狠狠色综合图片区 | 亚洲精品一区三区三区在线观看 | 媚药调教被撑到合不拢h | 精品久久久久久久99热 | 亚州三级视频 | 亚洲 欧美 另类 中文 在线 | 性夜影院午夜看片 | 偷窥美女3 | 免费成人小视频 | 亚洲 欧美 国产 视频二区 | 久久综合狠狠综合久久综合88 | 日韩欧美群交P内射捆绑 | 99视频精品在线 | 欧美日韩国产在线一区二区 | 3DNagoonimation动漫 | 欧美午夜不卡在线观看 | 亚洲国产成人久久精品影视 | 青青青国产依人精品视频 | 国产产一区二区三区久久毛片国语 | 佐山爱巨大肥臀在线 | 久久精品动漫99精品动漫 | 交换年轻夫妇HD中文字幕 | 无套内射纹身女视频 | 国产亚洲精品久久久久小 |