2011-06-29 84 views
6

我試圖實例化一個PDO對象是這樣的:PHP PDO連接失敗拋出警告,腳本執行超時

$this->pdo['pdo'] = new PDO('mysql:host=127.0.0.1;dbname=mydb;charset=UTF-8', 
        'myuser', 'my pass'); 

我想趕上我以爲會被拋出的異常時,MySQL服務器沒有運行。

PHP.net說:「如果嘗試連接到所請求的數據庫失敗,則PDO :: __ construct()拋出PDOException。」

但是如果我關閉了數據庫服務器,並運行該腳本我得到的是一個警告:

Warning: PDO::__construct() [pdo.--construct]: [2002] 'A connection attempt failed 
because the connected party did not properly respond after a period of time, or 
established connection failed because connected host has failed to respond.' in 
C:\test\test.php on line 5 

Fatal error: Maximum execution time of 60 seconds exceeded in C:\test\test.php 
on line 0 

沒有拋出異常。

是否有捕獲錯誤的直接方式(沒有臨時設置的麻煩自定義錯誤管理器功能?)

謝謝!

+0

執行時間超過了一個致命的錯誤如果可能的話,只要將「重要」位放入錯誤處理程序,人們可以輕鬆地繞過時間限制並運行腳本。 –

+2

我剛剛發現解決方案: ' $ this-> pdo ['pdo'] = new PDO('mysql:host = 127.0.0.1; dbname = mydb; charset = UTF-8','myuser','my pass',array(PDO :: ATTR_TIMEOUT = >「10」));' 最後一個參數(attributes數組)允許我指定一個比PHP的最大執行時間短的超時。然後異常拋出確定。 –

回答

4

傳遞數組配置爲PDO()的第四PARAM:

PDO::setAttribute (PDO::ATTR_TIMEOUT , '5'); //> Secs 

爲了降低連接超時

PDO::setAttribute (PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

始終拋出異常。

用法:

new PDO(,array(

       PDO::ATTR_TIMEOUT => "10", 
       PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION   

)); 
+0

因此,實例化應該是: '$ this-> pdo ['pdo'] = new PDO('mysql:host = 127.0.0.1; dbname = mydb; charset = UTF-8','myuser','my通過',數組(PDO :: ATTR_TIMEOUT =>「10」)); ' –

+0

謝謝!工作正常! –

+0

PDO :: setAttribute()是否靜態工作? –

0

我有一個類似的問題。我最終解決了它。

事情是,我有一個「新的PDO('mysql:host = 127.0.0.1; dbname = mydb','myuser','我的通行證');」進入for/while循環。

當我做3或4循環,它是好的。當我有5000次迭代時,我的mySQL服務器似乎阻止了我,然後我得到了「Warning:PDO :: __ construct()[pdo .-- construct]:[2002]'連接嘗試失敗...'錯誤消息。

我知道這是不是太聰明,把一個「新PDO(...」進入一個循環。希望這會幫助你們。

安東尼

+0

這是一種解決方法,而不是解決方案,但感謝分享它。 –

+0

我認爲這個問題要麼是php引擎,要麼是幾乎同時打開500個連接的mysql。由於我在同一個DB上使用同一個用戶進行了所有查詢,所以我不需要打開新的連接。我認爲這個問題與mysql服務器的重載有關,或者可能是一次針對同一個源的太多請求的保護。那麼,除了解決了我的問題之外,我不多。 :) – antoine