2014-10-05 813 views
6

得到這個在我的錯誤日誌飄飛,想弄清楚這個問題:SQLSTATE [HY000] [2002]連接超時

[04-Oct-2014 13:25:42 America/Chicago] Failed to connect to database: SQLSTATE[HY000] [2002] Connection timed out [04-Oct-2014 13:25:42 America/Chicago] PHP Fatal error: Call to a member function prepare() on a non-object in /home/spconlin/public_html/spc_app/app/add_log.php on line 28

連接腳本:

<?php 

if(!defined('INCLUDE_CHECK')) die('You are not allowed to execute this file directly'); 

// db config 
$db_host  = '127.0.0.1'; 
$db_database = '*****'; 
$db_user  = '*****'; 
$db_pass  = '*****'; 

//db connection 
try { 
    $db = new PDO("mysql:host=$db_host;dbname=$db_database;charset=utf8", $db_user, $db_pass, 
     array(
      PDO::ATTR_EMULATE_PREPARES => false, 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, //PDO::ERRMODE_SILENT is default setting 
      PDO::ATTR_PERSISTENT => false 
      ) 
    ); 
} 
catch(PDOException $e) { 
    error_log("Failed to connect to database: ".$e->getMessage()); 
} 

?> 

我做了什麼:

  • 從'lo calhost」爲127.0.0.1的連接
  • 開關持久連接到假

之前做上述變化,以我的連接如上圖所示我得到SQLSTATE[HY000] [2002] Resource temporarily unavailable而非connection timed out

一些背景信息 - 特別是這個add_log.php腳本在實際使用時將信息添加到數據庫,每秒最多幾次。雖然差不多99%的時間這個特定的腳本在錯誤中被引用,但有時候其他腳本也是如此。我意識到腳本指向真的並不意味着什麼,因爲這不是錯誤發生的地方(它發生在連接而不是add_log.php腳本中),但它很奇怪,它幾乎總是引用這個特定的文件,導致我相信這個問題經常被相繼提出是這個問題的一部分。

DB是innodb。

這實際上是我的服務器和數據庫或連接到它的人/計算機的問題?是否可能'他們'與'我'有不良聯繫,這是什麼原因導致錯誤?

編輯:

難道是在我需要我的網頁上的連接腳本需要它的方式?由於該文件經常被「擊中」,它也會要求我的連接腳本與下面的行一樣多。請注意,我正在使用$_SERVER['DOCUMENT_ROOT'](可能有影響?)。

require $_SERVER['DOCUMENT_ROOT'].'/custom/functions/connect.php';

+0

你能用客戶端登錄到你的數據庫嗎?沒有PHP?通常這是一個MySQL資源問題 – 2014-10-05 02:17:52

+0

什麼行代碼是在add_log.php行28?它似乎並不是你所包含的代碼的一部分。 – mschuett 2014-10-05 04:24:20

+0

它與op中提到的不相關。錯誤發生在連接中,然後在下次使用$ db時觸發。腳本沒有「錯誤」 - 它們工作正常 - 我無法自己複製此錯誤,並且它不會一直髮生。 – user756659 2014-10-05 16:25:09

回答

1

你應該在代碼中改進的事情是在創建新代碼之前檢查連接。

您應該設法儘可能重用連接,而不是重新創建不必要的連接。

當太多的連接打開時,你會遇到像這樣的錯誤,並且它不會很明顯地被重現。

此外,當連接不成功時,您應該在準備之前退出。

此更改可能需要您在類的內部實現該邏輯。

+0

你可以在此擴展嗎?我正在使用pdo。原本我打開了持續的連接......我現在已經關閉了。其次,在pdo中,腳本結束時會自動關閉連接。所以,唯一打開的連接就是應該打開的連接。 – user756659 2014-10-06 04:15:35

+0

如果有什麼'ATTR_PERSISTENT'應該設置爲true – meda 2014-10-06 04:16:44

+0

這是我原來的 - 當這是我仍然得到相同的錯誤,但他們是'SQLSTATE [HY000] [2002]資源暫時不可用' – user756659 2014-10-06 04:19:01

相關問題