【问题标题】:Setting a connect timeout with PDO使用 PDO 设置连接超时
【发布时间】:2014-02-19 14:28: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] Can't connect to MySQL server on...),在 PostgreSQL 上需要 30 秒(SQLSTATE[08006] [7 ] 超时)。

我尝试使用 PDO::setAttribute 和 PDO::ATTR_TIMEOUT 但它不起作用。我想这是有道理的,因为问题发生在此语句之前。

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

我想我在某处看到了这件事,但我一辈子都找不到了。

【问题讨论】:

    标签: php mysql postgresql 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
        )
    );
    

    【讨论】:

    • 谢谢。这正是我所追求的。我希望在某处提到这一点here
    • 也谢谢。与法国公共管理服务器合作很糟糕:D
    • 顺便说一下,时间是以秒为单位的。请参阅php.net/manual/en/pdo.setattribute.php 了解更多信息
    • 对此需要注意的一点是,您需要在 PDO 实例化中设置 PDO::ATTR_TIMEOUT。如果您在实例化后尝试使用$DBH->setAttribute(PDO::ATTR_TIMEOUT, 10) 之类的东西,它将无法正常工作!
    • 我试过这个设置 PDO::ATTR_TIMEOUT => 60,更改为无效的 IP 但它不起作用。超时发生在 20 秒后
    【解决方案2】:

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

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

    【讨论】:

    • 在 OSX 上,我的地址是 /usr/local/etc/freetds.conf
    • 我正在使用 DBLIB(pdo_dblib PHP 扩展),并且传递属性有效。 new PDO("dblib:host=$host;dbname=$dbname", $user, $pass, $attributes)
    猜你喜欢
    • 2015-08-14
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 2019-07-26
    • 1970-01-01
    • 2012-05-01
    • 2014-11-15
    • 1970-01-01
    相关资源
    最近更新 更多