萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> mysql_connect() 和 mysql_pconnect()

mysql_connect() 和 mysql_pconnect()

mysql_connect()和mysql_pconnect(),前者的作用是每次連接都建立一個新連接,後者則是持續的連接。

    mysql_connect()會在每次調用當前php頁面時建立一個或是多個新的連接,然後在請求結束後關閉這些連接。這種方式比較適合使用在不太繁重的頁面中,不需要調整,直接在內部使用。
    mysql_pconnect()也會在頁面被調用的時候新建一個連接,但是在請求結束後不會關閉連接,反而在把連接保存在連接池中,這樣一個並發的請求還能繼續使用這個連接。這種連接方式是提供給那些使用非常頻繁的頁面,不然資源會被頻繁的開與關消耗掉,這樣就對性能有嚴重的影響。
    mysql_pconnect()中的p,就是單詞persistent(永久的)的首字母。

    mysql_pconnect()需要服務器的調整,也需要限制連接的數量,配置超時,以及什麼時候處理空閒進程。他能讓你在正確的環境中改善效率。
Pconnect會經常的導致Mysql連接失敗,提示連接太多,原因在於pconnect後,Apache不會自動關閉mysql的連接.
先來看看APACHE的工作模式
Windows 下,Apache使用一個主進程,加一個輔進程,再由輔進程派生N個線程的方式來提供服務,線程的數量可以在httpd.conf裡配置: ThreadsPerChild 500,如果指定為500線程,則apache一啟動時就會啟動500個線程,但最多也只使用500個線程,如果同時連接數量超過500個(可能300個用戶訪問就有500個連接,判斷當前連接的方法,可以使用netstat -na|grep 80|grep EST|wc -l或者使用apache的status module),那麼,多余的連接將會在等待或者連接失敗.(所以,Windows下Apache的主要配置參數應該是ThreadsPerChild, 先根據當前的連接數,再看看有沒有必要調大一些,一般PC服務器設置為1000算是比較大了.)
Nix下,Apache使用進程的方式來運行,原理相同,需要調整進程數量的參數有幾個,比如ServerLimit.

再來看看Apache+PHP+Mysql_pconnect的工作方式
每當客戶端向服務端發送一個連接請求(包括圖片,HTML,PHP等),apache將會用一個線程來接受這個請求,如果是請求的是一個PHP文件,且 PHP文件裡使用了PConnect,則當前線程會判斷當前線程有沒有打開過pconnect,如果有打開過,則使用原來的mysql connect,如果沒有打開過,則新建一個connect,並且,連接斷開後,線程仍在運行,而且保持Mysql connect.按這種方式運行一段時間後,完全有可能所有apache的線程都打開過有Pconnect的Php頁面,所以,如果apache的 ThreadsPerChild=500的話,則500個線程都找開了mysql連接,並且沒有關閉,則就要求,mysql的連接數必須大於或等於 500,如果小於這個值,將會導致PHP頁面提示數據庫連接失敗.

所以,得出結論,Apache+PHP+Mysql下使用 pconnect時,mysql的max_connect必須大於或等於apache的最大線程(進程)數.在一個訪問量很大的站點,使用 pconnect可能不太現實,最好的辦法是,盡可能的將數據庫內容生成為靜態文件,而不需要每個頁面都連接數據庫,並且使用mysql_connect (即使將絕大多數頁面生成為靜態文件,但仍有mysql_pconnect時,同樣要求mysql的max_connect大於apache的線程數,所以這種情況下使用pconnect非常不可取).

永久的數據庫連接是指在您的腳本結束運行時不關閉的連接。當收到一個永久連接的請求時。PHP 將檢查是否已經存在一個(前面已經開啟的)相同的永久連接。如果存在,將直接使用這個連接;如果不存在,則建立一個新的連接。所謂“相同”的連接是指用相同的用戶名和密碼到相同主機的連接。
對 WEB 服務器的工作和分布負載沒有完全理解的讀者可能會錯誤地理解永久連接的作用。特別的,永久連接不會在相同的連接上為您提供建立“用戶會話”的能力,也不提供有效建立事務的能力。實際上,從嚴格意義上來講,永久連接不會給您提供任何非永久連接無法提供的特殊功能。
為什麼?
這和 WEB 服務器工作的方式有關。您的 WEB 服務器可以用三種方法來利用 PHP 生成 WEB 頁面。
第一種方法是將 PHP 用作一個“外殼”。以這種方法運行,PHP 會為向您的 WEB 服務器提出的每個 PHP 頁面請求生成並結束一個 PHP 解釋器線程。由於該線程會隨每個請求的結束而結束,因此任何在這個線程中利用的任何資源(例如指向 SQL 數據庫服務器的連接)都會隨線程的結束而關閉。在這種情況下,您使用永久連接不會獲得任何地改變

copyright © 萬盛學電腦網 all rights reserved