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

标签 php pdo odbc unixodbc

documentation对于 ATTR_TIMEOUT 说:

Specifies the timeout duration in seconds. Not all drivers support this option, and it's meaning may differ from driver to driver. For example, sqlite will wait for up to this time value before giving up on obtaining an writable lock, but other drivers may interpret this as a connect or a read timeout interval.

我通过 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;
}

关于php - 是什么决定了 PDO::ATTR_TIMEOUT 如何与 ODBC 连接一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23022670/

相关文章:

PHP 更新查询 : Unknown column in 'field list'

php - 允许用户删除个人资料信息

php - PDOException SQLSTATE [42000] : Syntax error or access violation: 1064

php - 函数返回的数组的奇怪行为

sql - 为 ODBC 数据源编写 SQL 查询

SQL Server 2008 : should I be using Windows auth or SQL Server auth?

php - 使用 php cURL 发送图像

php - 当指针恰好位于 mysql_num_rows 的 1/2 时,mysql_fetch_array 返回 false

PHP $_GET 产品页面 PDO

python - 如何在 Linux 中连接 Teradata 和 Python?