什么决定了PDO :: ATTR_TIMEOUT如何与ODBC连接一起工作?

时间:2014-04-11 21:12:15

标签: php pdo odbc unixodbc

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驱动程序本身提供的?试图找出从哪里开始调试。

1 个答案:

答案 0 :(得分:2)

我最终只是试图通过超时(在正确的端口上)打开与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;
}