2011-06-12 100 views
6

我的託管服務提供商的客戶端因爲太多未關閉的mysql連接而阻塞了該站點。 該網站以前由某人創建,目前我正在維護它。如何關閉未關閉的mysql連接?

我在頁面的末尾添加了mysql_close函數。它正在關閉連接,但仍然有一些連接未關閉。我可能留下了一些地方..

我需要的是關閉在使用cron的文件或一些東西服務器未關閉MySQL連接..

我有什麼做的?

是否可以一次關閉所有連接?如果是這樣,怎麼樣?

+0

你可以嘗試使用'mysql_pconnect',它具有副作用,雖然如http://stackoverflow.com/questions/1340859/which-is-better-mysql-connect-or-mysql-pconnect – konsolenfreddy 2011-06-12 07:43:45

+0

如何關閉在mysql_pconnect中打開的連接讓試試看吧.. – Jagadeesan 2011-06-12 07:52:12

回答

6

您是否使用持續連接?如果不是,那麼你真的不應該太擔心關閉你的連接。從manual

使用mysql_close()通常沒有必要 ,作爲非持久性開放 鏈接在腳本執行的 結束自動關閉。見 也釋放資源。

而不是太多未關閉的連接,它不是(它本質上是相同的),你有太多的開放連接?例如,您的網站上一次使用的用戶太多?

如果您有持久連接,千萬不要忘記:

mysql_close()不會關閉()由 mysql_pconnect創建 持久連接。

正如在評論中所說的那樣,在腳本末尾不會釋放一個mysql_connect()資源。從另一個manual page

釋放資源

由於與PHP 4的Zend的 引擎,沒有更多的 引用它的資源推出的引用計數 系統會自動檢測 ,它是被 垃圾收集器釋放。由於這個原因,它很少需要手動釋放內存 。

注意:持久數據庫鏈接是此規則的一個例外 。它們不是由垃圾收集器銷燬的 。 有關更多信息,請參閱持續連接部分 。

可能會有然而阿里納斯,從評論上mysql_close page

至少在PHP5.3.2和Windows 通過TCP連接,你應該總是 使用這種mysql_close()函數來 關閉並釋放由PHP使用的 的tcp套接字。 腳本執行後的垃圾回收不會自行關閉 tcp套接字。否則,插座 將保持「等待」狀態 大約30秒,並且任何 附加頁面加載/連接 嘗試將僅添加到總共 開放tcp連接的數量。此 等待時間似乎不是 可通過PHP設置進行配置。

+0

連接似乎只用mysql_connect()打開..如何關閉打開即使在mysql_pconnect中也試試.. – Jagadeesan 2011-06-12 07:48:01

+1

但是可以肯定的是:你不需要關閉每一個連接在文件的末尾:它將在那裏自動關閉。如果你想半途而廢,只需要關閉它就可以釋放資源。不要浪費時間和努力爲所有腳本添加'mysql_close':D。如果你不使用'pconnect',你不必擔心關閉那些課程 – Nanne 2011-06-12 07:51:22

+0

不,它不是自己關閉的: – Jagadeesan 2011-06-12 08:01:46

0

如果你得到一些未關閉的連接,你可能會錯過某些頁面,或者通過包含等,或者調用「退出」函數,所以你不會達到你的密碼。

我不相信你可以使用cron從mysql啓動其他連接。

2

mysql_connect將返回實際連接的標識符,您可以在mysql_close調用中使用該標識符。

$conn1 = mysql_connect(.....); 
mysql_close($conn1); 

如果頁面本身打開多個連接,則需要使用標識符,否則mysql_close()只會關閉最後打開的連接。

但正如Nanne所言,PHP通常會在頁面執行後自行清理連接,所以問題是如果不關閉它們,或者如果同時打開太多連接。通常,每個請求只需要1個連接,除非您同時打開並遍歷多個結果集。