快網首頁 | 虛擬主機 | 域名注冊 | 特惠套餐 | 企業郵局 | SQL空間 | IDC業務 | 全球通郵
關于PHP連接Mysql的程序中,出現Too many connections 的問題
客服中心新聞動態常見問題常用資料知識學堂走近客服在線提問網站導航
關于PHP連接Mysql的程序中,出現Too many connections 的問題
 空間問題 | 域名問題 | 主機問題 | Sql 問題 | 郵局問題 | 財務問題 | 會員問題 | 其它問題

 您的位置:快網首頁 >> 客服中心 >> 常見問題 >> 空間問題 >> 文章正文

關于PHP出現Too many connections 的問題
供稿:潤之康   時間:2009-6-29 18:07:37

以前有朋友問過我,為什么他的網站出現Too many connections 錯誤。因為我自己沒有遇到過這個問題,那時候工作也忙,沒有時間去考慮這個問題。幾個星期前,到現在的公司工作,有朋友告訴我,我現在的公司的網站上出現同樣的問題,到了非要搞清楚的地步了,于是在PHP手冊里面找關于mysql_connect和mysql_pconnect的資料,下面是在php手冊中對這兩個函數的描述:


-------- mysql_connect -----------

函數原型:
    resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]])
返回:
    如果成功則返回一個 MySQL 連接標識,失敗則返回 FALSE。
描述:
    mysql_connect() 建立一個到 MySQL 服務器的連接。當沒有提供可選參數時使用以下默認值:server = 'localhost:3306',username =

服務器進程所有者的用戶名,password = 空密碼。
   如果用同樣的參數第二次調用 mysql_connect(),將不會建立新連接,而將返回已經打開的連接標識。參數 new_link 改變此行為并使

mysql_connect() 總是打開新的連接,甚至當 mysql_connect() 曾在前面被用同樣的參數調用過。參數 client_flags 可以是以下常量的組合

:MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或者 MYSQL_CLIENT_INTERACTIVE。
    注: new_link 參數自 PHP 4.2.0 起可用。
        client_flags 參數自 PHP 4.3.0 起可用。
一旦腳本結束,到服務器的連接就會被關閉。除非之前已經調用了 mysql_close() 來關閉它。

------- mysql_pconnect -------------

函數原型:
resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]])
返回:
如果成功則返回一個正的 MySQL 持久連接標識符,出錯則返回 FALSE。
描述:
    mysql_pconnect() 建立一個到 MySQL 服務器的連接。如果沒有提供可選參數,則使用如下默認值:server = 'localhost:3306',

username = 服務器進程所有者的用戶名,password = 空密碼。client_flags 參數可以是以下常量的組合:MYSQL_CLIENT_COMPRESS,

MYSQL_CLIENT_IGNORE_SPACE 或者 MYSQL_CLIENT_INTERACTIVE。
    server 參數也可以包括端口號,例如 "hostname:port",或者是本機套接字的的路徑,例如 ":/path/to/socket"。
    注: 對 ":port" 的支持是 3.0B4 版添加的。
        對 ":/path/to/socket" 的支持是 3.0.10 版添加的。
   
-------- 兩者之間的區別 --------------
mysql_pconnect() 和 mysql_connect() 非常相似,但有兩個主要區別。
    首先,當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接

標識而不打開新連接。
    其次,當腳本執行完畢后到 SQL 服務器的連接不會被關閉,此連接將保持打開以備以后使用(mysql_close() 不會關閉由

mysql_pconnect() 建立的連接)。
    可選參數 client_flags 自 PHP 4.3.0 版起可用。
此種連接稱為"持久的"。


看到這里,寫一條代碼來測試一下
/*
* pconnect_test.php
*/
$link = mysql_pconnect("localhost", "mysql_user", "mysql_password")
        or die("Could not connect: " . mysql_error());
    print ("Connected successfully");
    通過刷新網頁的方式執行這條代碼,發現每執行一次,mysql的進程數就增加一個。在這里我不禁有了疑問。上面說mysql_pconnect這個函

數的使用的時候,不是說"當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到

,則返回此標識而不打開新連接"么?為什么我每刷新一次頁面他就給我打開一個新的連接呢?

    考慮到這有可能是PHP的bug,我到PHP的bug列表中找關于和too many connections 有關的條目。
相關的話題主要有三個,分別是
#11966        mysql_pconnect opens new connections with the same parameters
#26117        Persistent connection not reused
#13589        Persistent connections stay open and accumulate
    描述比較長,我就不在這里貼,具體的內容你自己去看。重點主要是"當一個進程打開一個mysql的持續連接,只要該進程還存在,這個持續

的連接就不會斷開,而且每一個進程會打開一個mysql的持續連接,而不能使用其他進程打開的持續連接"。
    到這里,我把相關的信息發給上海的朋友張宏,他提示我把apache的子進程數限制到不高于mysql的最大連接數。我問了我們的系統管理員

,他說我們的服務器上apache的最大子進程數是256,而mysql的最大連接數限制為600。就是說mysql的最大連接數已經遠遠超過httpd的進程數

,為什么還會出現Too many connections 這樣的錯誤呢?答案就在于PHP程序。打開以前同事寫的程序,發現同一個運行腳步中過多的調用

mysql_pconnect函數。如果在應用服務器上,每一個httpd子進程使用一個php腳本,每一個php腳本打開不止一個mysql的連接。因為httpd所產

生的子進程的生存期是apache服務器指定的,一般服務器不重啟,這些進程就一直存在。就算服務器重啟,也可以指定保存這些進程。由于進

程的存在,那么這些連接都不會斷掉,并且每個進程打開幾個連接數,那么統計起來,連接數就達到了mysql限制的最大連接數。這時就出現

Too many connections 錯誤。
    小結一下,要保證你的系統不會出現Too many connections 錯誤,需要注意兩點:
    1.保證你的apache的最大進程數不超過mysql的最大連接數;
    2.不要在程序里面用過多mysql_pconnect連接到同一個數據庫服務器(一個就夠了).這需要好的編碼習慣和規范.特別是不斷的給系統增加

    新的功能,如果不注重系統架構和編碼規范,當系統的復雜度到了一定的程度,整個系統就變得無法維護了.出現問題的時候解決起來就很麻煩了.


快網保留以上說明的最終解釋權
快網,域名注冊,虛擬主機,ASP空間,企業郵局,SQL空間,主機租用,主機托管
   
熱門搜索:FTP 域名 DNS 備案 空間 郵箱 SQL 主機 快網 中文域名 虛擬主機
快網,域名注冊,虛擬主機,ASP空間,企業郵局,SQL空間,主機租用,主機托管
快網客服中心的相關信息:
v 什么是虛擬空間? [2009-3-8 22:12:36]
v 什么是網站后臺?什么是網站前臺? [2009-3-5 23:05:51]
v 什么是網站流量? [2009-3-5 23:00:53]
v 什么是網站地圖? [2009-3-5 22:55:04]
v 什么是網站?網站是什么意思呢? [2009-3-5 22:49:49]
快網,域名注冊,虛擬主機,ASP空間,企業郵局,SQL空間,主機租用,主機托管
快網,域名注冊,虛擬主機,ASP空間,企業郵局,SQL空間,主機租用,主機托管
如果您在使用我們的產品中遇到問題,建議您首先在“常見問題”中查詢解決方法;
如果沒有找到該問題的解決方法,您可以在“問題搜索”中進行搜索;
如果搜索后沒有找到滿意答案,您可以“在線提問”,我們會盡快給您答復。
快網,域名注冊,虛擬主機,ASP空間,企業郵局,SQL空間,主機租用,主機托管
域名注冊查詢中文域名轉碼
域名whois查詢網站PR值查詢
快網,域名注冊,虛擬主機,ASP空間,企業郵局,SQL空間,主機租用,主機托管

:::::: | 收藏本站 | 關于我們 | 客服中心 | 付款方式 | 聯系我們 | 網站律師 | 工作機會 | 網站地圖 | 產品管理 | ::::::

Copyright (C) 2003-2008 天津追日科技發展有限公司  Cnkuai.cn  快網.cn  中國快網.cn
四川快乐12一定牛手机版开奖查询