【问题标题】:What determines how PDO::ATTR_TIMEOUT works with an ODBC connection?什么决定了 PDO::ATTR_TIMEOUT 如何与 ODBC 连接一起工作?
【发布时间】:2014-05-26 04:53:45
【问题描述】:

ATTR_TIMEOUT 的 documentation 表示:

以秒为单位指定超时持续时间。并非所有驱动程序都支持 此选项,其含义可能因驱动程序而异。为了 例如,sqlite 在放弃之前会等待到这个时间值 在获得可写锁时,但其他驱动程序可能会将其解释为 连接或读取超时间隔。

我通过 unixODBC 使用 ODBC 连接到名为 Vertica 的封闭源数据库,当我通过以下方式连接时,我没有看到正确的连接超时行为:

$this->conn = new PDO($dsn, $user, $password,
                      array(PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
                            PDO::ATTR_TIMEOUT => 2));   // timeout in 2 seconds

该行为是由 PDO PHP 类、unixODBC 还是 Vertica ODBC 驱动程序本身提供的?试图找出从哪里开始调试。

【问题讨论】:

标签: php pdo odbc unixodbc


【解决方案1】:

我最终解决了这个问题,方法是尝试使用超时(在正确的端口上)打开与 vertica 的 TCP 连接,并在成功连接时立即关闭。虽然这并不能保证我实际上是在与一个健康的 Vertica 数据库通信,但对于我自己的用例来说已经足够了。

这样的事情似乎工作正常:

protected function isAlive() {
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_set_nonblock($socket);
    for ($i=0; $i<5; $i++) {
        if(!@socket_connect($socket, $this->host, $this->port)) {
            usleep(100000);                 // sleep for 0.1 seconds
        } else {
            return true;
        }
    }
    return false;
}

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 2013-03-27
    • 2019-03-08
    • 2018-09-01
    • 2016-10-19
    • 2020-10-24
    • 1970-01-01
    • 2018-03-16
    • 2014-02-04
    相关资源
    最近更新 更多