是什么决定PDO::ATTR_TIMEOUT如何使用ODBC连接


What determines how PDO::ATTR_TIMEOUT works with an ODBC connection?

ATTR_TIMEOUT的文档说明:

指定超时持续时间(秒(。并非所有驱动程序都支持这个选项,它的含义可能因驾驶员而异。对于例如,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驱动程序本身提供的吗?试图弄清楚从哪里开始调试。

我最终解决了这个问题,只需尝试在超时的情况下(在正确的端口上(打开与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;
}