什么决定PDO :: ATTR_TIMEOUT如何与ODBC连接一起使用?
问题描述:
的documentation为ATTR_TIMEOUT说:什么决定PDO :: ATTR_TIMEOUT如何与ODBC连接一起使用?
指定秒的超时时间。并非所有的驱动程序都支持 这个选项,它的含义可能因驱动程序而异。例如,对于 示例,sqlite会在放弃 获取可写锁定之前等待此时间值,但其他驱动程序可能将此解释为连接或读取超时间隔为 。
我使用通过了unixODBC到名为Vertica的闭源数据库的ODBC连接,当我通过连接我没有看到合适的连接超时行为:
$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([email protected]_connect($socket, $this->host, $this->port)) {
usleep(100000); // sleep for 0.1 seconds
} else {
return true;
}
}
return false;
}
此bug从2008年存在,但它并不像它曾经做了它成源代码树的PHP:HTTPS://bugs.php。净/ bug.php?ID = 45287 –