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