使用PDO设置连接超时

gkr*_*res 28 php mysql postgresql pdo

我正在使用PDO从SQL服务器上获取数据.后来我发现是这样的:如果SQL服务器不可用,它需要真正的(相对)长此代码返回一个例外:

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;
}
Run Code Online (Sandbox Code Playgroud)

在MySQL的情况下,发生异常只需要2分钟(SQLSTATE [HY000] [2003]无法连接到MySQL服务器......)和PostgreSQL上的30秒(SQLSTATE [08006] [7]超时到期).

我尝试使用PDO :: setAttribute和PDO :: ATTR_TIMEOUT,但它不起作用.我认为这是有道理的,因为问题发生在这个陈述之前.

有没有办法设置连接到DB的超时?对于PDO而言,2分30秒对我来说似乎很长时间才意识到那里什么也没有.

我想我看到这是在某个地方完成的,但在我的生活中再也找不到它.

小智 68

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

  • 有一点需要注意的是,您需要在PDO实例化中设置PDO :: ATTR_TIMEOUT.如果在实例化后尝试使用类似`$ DBH-> setAttribute(PDO :: ATTR_TIMEOUT,10)`的东西,它将无法工作! (7认同)
  • 顺便说一下,时间以秒为单位。有关更多信息,请参见http://php.net/manual/zh/pdo.setattribute.php。 (2认同)
  • 我尝试过此设置 PDO::ATTR_TIMEOUT => 60,更改为无效的 IP,但它不起作用。20 秒后发生超时 (2认同)

gbu*_*m89 8

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

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