使用PDO设置连接超时

时间:2014-01-28 10:31:04

标签: php mysql postgresql pdo

我正在使用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 个答案:

答案 0 :(得分:59)

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

答案 1 :(得分:7)

我正在使用DBLIB驱动程序进行PDO - 并且不支持传递选项(抛出警告)。

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