PHP PDO连接失败引发警告,脚本执行超时

PHP PDO连接失败引发警告,脚本执行超时,php,pdo,Php,Pdo,我试图实例化一个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()将引发PDO异常。” 但是如果我关闭数据库服务器并运行脚本,我得到的只是一

我试图实例化一个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()将引发PDO异常。”

但是如果我关闭数据库服务器并运行脚本,我得到的只是一个警告:

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
没有抛出异常

是否有直接捕获错误的方法(无需临时设置自定义错误管理器功能的麻烦?)


谢谢

将数组配置作为PDO()的第四个参数传递:

要降低连接超时,请执行以下操作:

总是抛出异常

用法:

new PDO(,array(

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

));

我也有类似的问题。我终于解决了

问题是,我在for/while循环中使用了一个“新PDO('mysql:host=127.0.0.1;dbname=mydb','myuser','my pass');”

当我做3个或4个循环时,它是正确的。当我有5000次迭代时,我的mySQL服务器似乎会阻止我,然后我会收到“警告:PDO::_construct()[PDO.-construct]:[2002]“连接尝试失败…”错误消息

我知道这不太聪明,无法将“新PDO(…”放入循环中。希望这能帮助你们


antoine

超过执行时间是一个无法捕获的致命错误。如果可以,人们可以轻松绕过时间限制,只需将“重要”位放入错误处理程序,就可以随意运行脚本。我刚刚找到了解决方案:
$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 array)允许我指定一个比PHP的最大执行时间短的超时。然后异常抛出OK。因此,实例化应该是:
$this->PDO['PDO']=new PDO('mysql:host=127.0.0.1;dbname=mydb;charset=UTF-8','myuser','my pass',array(PDO::ATTR_TIMEOUT=>“10”);
@sebastian:nope:)。这是以Official docu为例的。这与其说是一个解决方案,不如说是一个解决方案,但感谢大家分享。我认为问题在于php引擎或mysql的引擎几乎无法同时打开500个连接。因为我在同一个数据库上使用同一用户进行所有查询,所以我不需要打开新的连接ns.我认为这个问题与mysql服务器的过载有关,或者可能是为了防止同一个源一次发出过多的请求。好吧,除了解决了我的问题外,我没有做太多
PDO::setAttribute ( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
new PDO(,array(

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

));