使用PDO设置连接超时时间

46
我正在使用PDO从MySQL服务器获取数据。我注意到的是:如果MySQL服务器不可用,这段代码会花费相当长的时间来返回一个异常:

try {
  $handle = new PDO($db_type . ':host='.$db_host.';dbname='.$db_name,$db_user,$db_pass);
  // Tried using PDO::setAttribute and PDO::ATTR_TIMEOUT here
} catch(PDOException $e) {
  echo $e->getMessage;
}

在MySQL中,异常需要超过2分钟才能发生(SQLSTATE [HY000] [2003]无法连接到MySQL服务器...),而在PostgreSQL上需要30秒(SQLSTATE [08006] [7]超时已过期)。
我尝试使用PDO :: setAttribute和PDO :: ATTR_TIMEOUT,但它不起作用。我想这是有道理的,因为问题发生在此语句之前。
有没有一种方法来设置连接到数据库的超时时间? 对于PDO来说,2分钟/ 30秒似乎太长了,以至于它无法意识到什么都没有。
我记得我在某个地方看到过这样做,但我再也找不到它了。
2个回答

98
$DBH = new PDO(
    "mysql:host=$host;dbname=$dbname", 
    $username, 
    $password,
    array(
        PDO::ATTR_TIMEOUT => 5, // in seconds
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    )
);

谢谢。这正是我想要的。我希望在 这里 能找到相关信息。 - gkres
1
谢谢。与法国公共管理服务器一起工作真是太糟糕了 :D - Alexandre Bourlier
2
顺便提一下,时间以秒为单位指定。有关更多信息,请参见http://php.net/manual/en/pdo.setattribute.php - yothsoggoth
11
需要注意的是,您需要在PDO实例化时设置PDO :: ATTR_TIMEOUT。如果您尝试在实例化后使用诸如“$DBH->setAttribute(PDO :: ATTR_TIMEOUT,10)”之类的内容,则不起作用! - Gwi7d31
1
我尝试了这个设置PDO::ATTR_TIMEOUT => 60,将IP更改为无效的IP,但它没有起作用。超时在20秒后发生。 - D T
显示剩余3条评论

10

我正在使用PDO的DBLIB驱动程序,它不支持传递选项(会抛出警告)。

为了解决这个问题,你可以编辑FreeTDS配置文件中的connection_timeout设置,该文件位于Ubuntu上的/etc/freetds/freetds.conf


1
在OSX上,我的文件位于/usr/local/etc/freetds.conf - james2doyle
1
我正在使用DBLIB(pdo_dblib PHP扩展),并且传递属性是有效的。new PDO("dblib:host=$host;dbname=$dbname", $user, $pass, $attributes) - mbomb007

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接