2011-06-29 82 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