2013-07-03 122 views
0

由於「連接太多」,PHP mysql_connect有時會失敗。 當檢查進程狀態列表時,我注意到當發生這種情況時,有非常長的處於睡眠狀態的進程。多久?時間:28490連接太多由於許多睡眠連接導致錯誤

這是我如何初始化連接:

  $this->connection[$server] = mysql_connect($credentials['dbUrl'], $credentials['dbUser'], $credentials['dbPass'], true); 

這不會發生的事情,只是有時候會連接獲得「卡住」。我認爲它可能與頁面上的某些內容沒有完成(圖像未加載?外部服務卡住?)有關。什麼時候腳本正式完成?它是在頁面完全加載之後嗎?

我想過兩種可能的解決方案: 1.使用mysql_close。 2.更改最大MySQL超時(/etc/my.cnf) 3.處理腳本超時。

什麼原因會導致連接陷入「睡眠」? 您如何建議解決/進一步調查問題?

+0

由於它似乎是PHP,當腳本完成時應該釋放連接,完全獨立於圖像和其他嵌入式內容加載。如果你的PHP腳本掛起,連接仍然存在。 –

+0

@JoachimIsaksson什麼會導致PHP腳本掛起? – Noam

+0

有很多原因,通常是一個永不終止的循環,或者等待一些從未真正發生的外部事件發生。 –

回答

1

一個好的解決方案是將你的連接放入一個函數,然後添加一個析構函數爲你關閉連接。這樣連接會自動關閉最後一次調用mysql連接後的連接。

class DbConn { 
    public $connection; 

    public function __construct($host, $name, $user, &$pass) { 
     $this->connection = mysql_connect(mysql_connect($host, $user, $pass); 
     if(mysql_connect_errno) { 
      echo mysql_connect_error; 
     } else { 
      mysql_select_db($name, $this->connection); 
     } 
     unset($pass); //Clear password for security. 
    } 

    public function __destruct() { 
     mysql_close($this->connection); 
    } 
} 

這應該照顧最開放的連接,因爲他們將腳本結束之前關閉,即使腳本掛起的圖像上,最後一個運行的查詢後,連接關閉。您可能仍會獲得一些,但不足以導致too many connections錯誤。