2014-05-05 18 views
1

我試圖做一個持久連接的php + pdo網站。當然,連接每8小時不活動的關閉,所以我嘗試創建,如果它被關閉PHP/PDO - 服務器已經消失,異常

這裏說重新打開連接的PHP文件是我的代碼:

try{ 
      $db = new PDO("mysql:host=$database_ip;dbname=$database_name", $database_username, $database_password, array(PDO::ATTR_PERSISTENT => true)); 
    }catch(Exception $x){ 
      try{ 
       $db = new PDO("mysql:host=$database_ip;dbname=$database_name", $database_username, $database_password); 
      }catch(Exception $x){ 
       echo 'Failed database error'; 
      } 
} 

This說,「PDO :: __ construct()將始終拋出PDOException,如果連接失敗,無論當前設置了哪個PDO :: ATTR_ERRMODE。未捕獲的異常是致命的。

的問題是,即使異常被捕獲它仍然是致命的:/

這裏的錯誤:

警告:PDO :: __結構():MySQL服務器已消失在線/path/to/website/mysql.inc.php

+0

這看起來是一個警告,不是一個錯誤。第一個連接正在消失,所以它會引發警告。第二次連接後連接仍然持續嗎? – Shawn

+0

@shawn我怎麼能把它變成一個錯誤? – john01dav

+0

默認情況下,PDO會引發警告。設置PDO :: ATTR_ERRMODE => PDO :: ERRMODE_EXCEPTION。我相信這會拋出異常。如果它對你有用,那麼這是一個正式的答案。 – Shawn

回答

4

首先,你應該抓住PDOException
二您已經嘗試將ATTR_PERSISTENT設置爲FALSE

try{ 
    $db = new PDO('...'); // array(PDO::ATTR_PERSISTENT => FALSE) 

}catch(PDOException $x){ 
    echo 'Caught exception: ', $x->getMessage(), "\n"; 
    try{ 
     //reconnect 
     $db = new PDO('...'); 
    }catch(PDOException $e){ 
     throw new Exception('Failed database error'.$e->getMessage()); 
    } 
} 
+0

我把它改成了PDOException,沒有改變。我無法將ATTR_Persistent更改爲false,因爲它完全禁用了持續連接:(。 – john01dav

1

@操作取消警告:

$db = @new PDO(...