2012-08-17 62 views
1

已經走了,我跑我的PHP腳本,並獲得一個間歇性問題:MySQL服務器在PDO

PHP致命錯誤:未捕獲的異常「PDOException」有消息「SQLSTATE [HY000]:常規錯誤:2013失去與MySQL服務器在查詢期間'

如果發生這種錯誤,是否可以在PDO中ping mysql?

我只是想在您的通知中提到這一點,即我的PDO連接不是持久的。我正在連接PDO。我想每次有新的連接都會循環打開。如果是這樣,那麼爲什麼mysql失去連接?或者,如果PDO連接已經存在,那麼它可能會提供現有的pdo對象。但是如果發生這種錯誤,它應該嘗試重新連接並給出新的連接而不是錯誤。

任何可能的解決方案,以避免錯誤?

+1

請發佈您的代碼 – 2012-08-17 10:15:19

+1

TRY和catch似乎是合法的。 。 – tomexsans 2012-08-17 10:18:04

回答

2

在我的情況下,PDO正在採取單一連接,並在環的大小大,連接被越來越定時出。所以,我增加了所有cli的PDO連接超時。

$this->connection = new PDO($this->dsn, $this->username, $this->password); 
//Increase the session time out for all cli's 
if(php_sapi_name() == 'cli'){ 
     $query = $this->connection->prepare("set session wait_timeout=10000,interactive_timeout=10000,net_read_timeout=10000"); 
     $query->execute(); 
} 

現在問題已解決。

+0

使用Boris作爲CLI來做測試,並且遇到了這個問題。以上解決方案對我來說 - 謝謝! – 2013-10-01 14:12:07

0

我建議try..catch塊內運行的數據庫查詢,像這樣:

try { 
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass); 
    // Do something here 
} catch (PDOException $e) { 
    print "Error!: " . $e->getMessage(); 
    die(); 
} 
+0

我已經在處理異常時與我的數據庫連接。 函數connect(){ 嘗試{this-> connection = new PDO($ this-> dsn,$ this-> username,$ this-> password);拋出新的jsDatabaseException($ e-> getMessage()。'[dsn:'。$ this-> dsn。']'); } $ this-> connection-> setAttribute(PDO_ATTR_ERRMODE,PDO_ERRMODE_EXCEPTION); } – 2012-08-17 10:57:19

+0

您需要對所有數據庫查詢使用try-catch,而不僅僅是連接。這樣,如果你做了選擇或更新並且數據庫連接已經消失 - 它會拋出一個異常,並且你可以捕獲它並且可能重新連接或者其他東西。 – Husman 2012-08-17 13:32:33

+0

這裏有類似的問題。 在我的腳本中,我向C發出了一個CALL,然後是一個SELECT。 雖然CALL在短時間內運行,但它用於正常工作。現在SP大約需要60秒。 SP完成沒有錯誤(處理大約800K行),但似乎PHP花費了太多時間。 限制SP處理1000行會在0.3秒內返回並且腳本繼續完美無缺。 它看起來只是驅動程序(PDO)的時間問題 任何人都有線索? – fernandojmartin 2012-12-20 15:44:32