監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉
重慶網(wǎng)站建設(shè)公司

當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 重慶OA系統(tǒng) > 重慶網(wǎng)站建設(shè)公司

關(guān)于PHP出現(xiàn)錯(cuò)誤提示的問(wèn)題

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

  以前有朋友問(wèn)過(guò)我,為什么他的網(wǎng)站出現(xiàn)Too many connections 錯(cuò)誤。因?yàn)槲易约簺](méi)有遇到過(guò)這個(gè)問(wèn)題,那時(shí)候工作也忙,沒(méi)有時(shí)間去考慮這個(gè)問(wèn)題。幾個(gè)星期前,到現(xiàn)在的公司工作,有朋友告訴我,我現(xiàn)在的公司的網(wǎng)站上出現(xiàn)同樣的問(wèn)題,到了非要搞清楚的地步了,于是在PHP手冊(cè)里面找關(guān)于mysql_connect和mysql_pconnect的資料,下面是在php手冊(cè)中對(duì)這兩個(gè)函數(shù)的描述:

-------- mysql_connect ----------- 函數(shù)原型: resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]]) 返回: 如果成功則返回一個(gè) MySQL 連接標(biāo)識(shí),失敗則返回 FALSE。 描述: mysql_connect() 建立一個(gè)到 MySQL 服務(wù)器的連接。當(dāng)沒(méi)有提供可選參數(shù)時(shí)使用以下默認(rèn)值:server = localhost:3306,username = 服務(wù)器進(jìn)程所有者的用戶名,password = 空密碼。 如果用同樣的參數(shù)第二次調(diào)用 mysql_connect(),將不會(huì)建立新連接,而將返回已經(jīng)打開(kāi)的連接標(biāo)識(shí)。參數(shù) new_link 改變此行為并使 mysql_connect() 總是打開(kāi)新的連接,甚至當(dāng) mysql_connect() 曾在前面被用同樣的參數(shù)調(diào)用過(guò)。參數(shù) client_flags 可以是以下常量的組合 :MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或者 MYSQL_CLIENT_INTERACTIVE。 注: new_link 參數(shù)自 PHP 4.2.0 起可用。 client_flags 參數(shù)自 PHP 4.3.0 起可用。 一旦腳本結(jié)束,到服務(wù)器的連接就會(huì)被關(guān)閉。除非之前已經(jīng)調(diào)用了 mysql_close() 來(lái)關(guān)閉它。 ------- mysql_pconnect ------------- 函數(shù)原型: resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]]) 返回: 如果成功則返回一個(gè)正的 MySQL 持久連接標(biāo)識(shí)符,出錯(cuò)則返回 FALSE。 描述: mysql_pconnect() 建立一個(gè)到 MySQL 服務(wù)器的連接。如果沒(méi)有提供可選參數(shù),則使用如下默認(rèn)值:server = localhost:3306, username = 服務(wù)器進(jìn)程所有者的用戶名,password = 空密碼。client_flags 參數(shù)可以是以下常量的組合:MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE 或者 MYSQL_CLIENT_INTERACTIVE。 server 參數(shù)也可以包括端口號(hào),例如 "hostname:port",或者是本機(jī)套接字的的路徑,例如 ":/path/to/socket"。 注: 對(duì) ":port" 的支持是 3.0B4 版添加的。 對(duì) ":/path/to/socket" 的支持是 3.0.10 版添加的。 -------- 兩者之間的區(qū)別 -------------- mysql_pconnect() 和 mysql_connect() 非常相似,但有兩個(gè)主要區(qū)別。 首先,當(dāng)連接的時(shí)候本函數(shù)將先嘗試尋找一個(gè)在同一個(gè)主機(jī)上用同樣的用戶名和密碼已經(jīng)打開(kāi)的(持久)連接,如果找到,則返回此連接 標(biāo)識(shí)而不打開(kāi)新連接。 其次,當(dāng)腳本執(zhí)行完畢后到 SQL 服務(wù)器的連接不會(huì)被關(guān)閉,此連接將保持打開(kāi)以備以后使用(mysql_close() 不會(huì)關(guān)閉由 mysql_pconnect() 建立的連接)。 可選參數(shù) client_flags 自 PHP 4.3.0 版起可用。 此種連接稱為"持久的"。

  看到這里,寫(xiě)一條代碼來(lái)測(cè)試一下 /* * pconnect_test.php */ $link = mysql_pconnect("localhost", "mysql_user", "mysql_password") or die("Could not connect: " . mysql_error()); print ("Connected successfully"); 通過(guò)刷新網(wǎng)頁(yè)的方式執(zhí)行這條代碼,發(fā)現(xiàn)每執(zhí)行一次,mysql的進(jìn)程數(shù)就增加一個(gè)。在這里我不禁有了疑問(wèn)。上面說(shuō)mysql_pconnect這個(gè)函 數(shù)的使用的時(shí)候,不是說(shuō)"當(dāng)連接的時(shí)候本函數(shù)將先嘗試尋找一個(gè)在同一個(gè)主機(jī)上用同樣的用戶名和密碼已經(jīng)打開(kāi)的(持久)連接,如果找到 ,則返回此標(biāo)識(shí)而不打開(kāi)新連接"么?為什么我每刷新一次頁(yè)面他就給我打開(kāi)一個(gè)新的連接呢? 考慮到這有可能是PHP的bug,我到PHP的bug列表中找關(guān)于和too many connections 有關(guān)的條目。 相關(guān)的話題主要有三個(gè),分別是 #11966 mysql_pconnect opens new connections with the same parameters #26117 Persistent connection not reused #13589 Persistent connections stay open and accumulate 描述比較長(zhǎng),我就不在這里貼,具體的內(nèi)容你自己去看。重點(diǎn)主要是"當(dāng)一個(gè)進(jìn)程打開(kāi)一個(gè)mysql的持續(xù)連接,只要該進(jìn)程還存在,這個(gè)持續(xù) 的連接就不會(huì)斷開(kāi),而且每一個(gè)進(jìn)程會(huì)打開(kāi)一個(gè)mysql的持續(xù)連接,而不能使用其他進(jìn)程打開(kāi)的持續(xù)連接"。 到這里,我把相關(guān)的信息發(fā)給上海的朋友張宏,他提示我把a(bǔ)pache的子進(jìn)程數(shù)限制到不高于mysql的最大連接數(shù)。我問(wèn)了我們的系統(tǒng)管理員 ,他說(shuō)我們的服務(wù)器上apache的最大子進(jìn)程數(shù)是256,而mysql的最大連接數(shù)限制為600。就是說(shuō)mysql的最大連接數(shù)已經(jīng)遠(yuǎn)遠(yuǎn)超過(guò)httpd的進(jìn)程數(shù) ,為什么還會(huì)出現(xiàn)Too many connections 這樣的錯(cuò)誤呢?答案就在于PHP程序。打開(kāi)以前同事寫(xiě)的程序,發(fā)現(xiàn)同一個(gè)運(yùn)行腳步中過(guò)多的調(diào)用 mysql_pconnect函數(shù)。如果在應(yīng)用服務(wù)器上,每一個(gè)httpd子進(jìn)程使用一個(gè)php腳本,每一個(gè)php腳本打開(kāi)不止一個(gè)mysql的連接。因?yàn)閔ttpd所產(chǎn) 生的子進(jìn)程的生存期是apache服務(wù)器指定的,一般服務(wù)器不重啟,這些進(jìn)程就一直存在。就算服務(wù)器重啟,也可以指定保存這些進(jìn)程。由于進(jìn) 程的存在,那么這些連接都不會(huì)斷掉,并且每個(gè)進(jìn)程打開(kāi)幾個(gè)連接數(shù),那么統(tǒng)計(jì)起來(lái),連接數(shù)就達(dá)到了mysql限制的最大連接數(shù)。這時(shí)就出現(xiàn) Too many connections 錯(cuò)誤。 小結(jié)一下,要保證你的系統(tǒng)不會(huì)出現(xiàn)Too many connections 錯(cuò)誤,需要注意兩點(diǎn): 1.保證你的apache的最大進(jìn)程數(shù)不超過(guò)mysql的最大連接數(shù); 2.不要在程序里面用過(guò)多mysql_pconnect連接到同一個(gè)數(shù)據(jù)庫(kù)服務(wù)器(一個(gè)就夠了).這需要好的編碼習(xí)慣和規(guī)范.特別是不斷的給系統(tǒng)增加 新的功能,如果不注重系統(tǒng)架構(gòu)和編碼規(guī)范,當(dāng)系統(tǒng)的復(fù)雜度到了一定的程度,整個(gè)系統(tǒng)就變得無(wú)法維護(hù)了.出現(xiàn)問(wèn)題的時(shí)候解決起來(lái)就很麻煩了.

發(fā)布:2007-04-07 16:44    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:

泛普重慶網(wǎng)站建設(shè)公司其他應(yīng)用

重慶OA軟件 重慶OA新聞動(dòng)態(tài) 重慶OA信息化 重慶OA客戶 重慶OA快博 重慶OA行業(yè)資訊 重慶軟件開(kāi)發(fā)公司 重慶網(wǎng)站建設(shè)公司 重慶物業(yè)管理軟件 重慶餐飲管理軟件 重慶倉(cāng)庫(kù)管理系統(tǒng) 重慶門(mén)禁系統(tǒng) 重慶微信營(yíng)銷 重慶ERP 重慶監(jiān)控公司 重慶金融行業(yè)軟件 重慶B2B、B2C商城系統(tǒng)開(kāi)發(fā) 重慶建筑施工項(xiàng)目管理系統(tǒng)開(kāi)發(fā)