2011-08-24 243 views
22

我已經在CodeIgniter中建立了一個社交社區網站,它現在已經獲得了相當的流量,託管公司已經開始抱怨並且說數據庫正在接收空連接以及沒有連接的連接, t正在關閉。CodeIgniter數據庫連接沒有關閉

我不完全確定一個空查詢是什麼或者如何最終被髮布,任何想法?

我已經添加了額外的代碼來強制關閉連接,當代碼達到結束,但顯然這是行不通的。

任何人都可以提供任何建議,看看或開始調試這樣的問題?

感謝

我已經在我的核心底部以下MY_Controller

public function __destruct() { 
    $this->db->close(); 
} 
+4

3的答案,而不是他們的單獨一個實際上是一個問題的題。 –

+0

您的主機是否引用了「空連接」? – hakre

+0

不幸的是我對空問題上沒有細節,從主持人:很多從那裏查詢本身是「空」的網站連接的 – ArthurGuy

回答

2

你試圖做$this->db->close();,做出詢問,後?

23

我認爲你流汗與笨連接數據庫的初始配置problemns。

在這個頁面,你可以看到從配置陣列中的每個值:
http://ellislab.com/codeigniter/user-guide/database/configuration.html

$db['default']['hostname'] = "localhost"; 
$db['default']['username'] = "root"; 
$db['default']['password'] = ""; 
$db['default']['database'] = "database_name"; 
$db['default']['dbdriver'] = "mysql"; 
$db['default']['dbprefix'] = ""; 
$db['default']['pconnect'] = TRUE; 
$db['default']['db_debug'] = FALSE; 
$db['default']['cache_on'] = FALSE; 
$db['default']['cachedir'] = ""; 
$db['default']['char_set'] = "utf8"; 
$db['default']['dbcollat'] = "utf8_general_ci"; 
$db['default']['swap_pre'] = ""; 
$db['default']['autoinit'] = TRUE; 
$db['default']['stricton'] = FALSE; 

這是一個基本的陣列配置數據庫,嘗試pconnect的變量設置爲FALSE,當它開啓,系統不會關閉任何連接,並且可以隨時開啓新聞查詢。

如果您像我說的那樣將其設置爲false,您的系統將繼續完美工作,但當他需要使用數據庫時,codeigniter將關閉並打開連接。

在這裏,你可以找到併發布codeigniter論壇與一個人有一個pconnect變量的問題,可以幫助你! http://codeigniter.com/forums/viewthread/177573/#842016

+1

感謝您的評論,但pconnect變量已被設置爲false。 – ArthurGuy

+0

pconnect = false正在工作..謝謝.. –

0

我早就有同樣的問題,解決方案是多部分的(沒有單個部分的問題出現,直到所有部分一起出現問題)。 PConnect應該關閉,除非你知道如何使用它(正如其他人所說的)。

要考慮的另一件事是你的Web服務器是否是線程的(例如Apache的工作模式 - 最常見的Web服務器)。如果您獲得大量流量,並且線程未盡快關閉,那麼您可能會遇到一些併發的Web服務器/數據庫服務器連接限制,或耗盡內存/處理器資源。這可能會導致某些數據庫連接掛起。

因此,我會檢查問題的其他跡象,而不是假設數據庫是來源。這可能是一個症狀。你有關於空連接的任何信息(比如哪個數據庫用戶產生它們)?這可以幫助你追溯到...

編輯:有一件事我忘了 - 有時PHP錯誤可以搞砸了CI的自毀操作(自動關閉連接,從我的理解),所以你可能會檢查你的錯誤太日誌。

1

我曾在過去使用CodeIgniter類似的問題,他們是由被默認啓用的CodeIgniter在MySQL的持久連接造成的。我曾經在MySQL中SHOW PROCESSLIST查詢,查看打開的連接,他們目前運行的查詢,時間(單位:秒)的連接已經開了,等等。如果連接處於空閒狀態Command外地回來將包含SleepInfo字段(查詢)將是NULL這可能是您的主機所指的。這是從這樣的問題開始的好地方。

,我想另一個要注意的是PHP,mysql_close這是被稱爲here從控制器的__destruct方法不會關閉持久的MySQL連接的細微差別。 PHP將在腳本執行結束時關閉非持久連接,因此通常不需要調用它。

我知道你說的持久連接沒有啓用,這是我如何着手調試我的問題,這聽起來非常相似,你的問題。

0

我解決了同樣的問題,在一個CI網站通過改變駕駛MySQL的'在「mysqli的」: database.php中:

$db['default']['dbdriver'] = "mysqli";