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;
}