使用 PDO 设置连接超时

2022-08-30 11:49:24

我正在使用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但它不起作用。我想这是有道理的,因为问题发生在这个声明之前。

有没有办法设置连接到数据库的超时?对我来说,2分/30秒似乎很长,PDO才能意识到那里什么都没有。

我想我在某个地方看到了这个,但为了我的生活,我再也找不到它了。


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

答案 2

我正在使用用于PDO的DBLIB驱动程序 - 这不支持选项的传递(引发警告)。

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


推荐