2017-07-31 46 views
3

我试图实现超时连接到一个火鸟2.5分贝。如何超时ibase_connect?

这是用于连接到150多台服务器的脚本。我的目标是失败的服务器,并转移到下一个,以维持脚本执行时间。

正常脚本执行时间为30秒,但如果一台服务器出现故障,则最多可提升300秒。 我在PHP 7上使用ibase扩展。

任何建议?

在此先感谢。

+0

有一个属性'isc_dpb_connect_timeout',但1)我不知道你怎么可以用'ibase_connect'配置,和2)IIRC它只是连接到后生效服务器,但在连接到数据库之前(这种失败的目的恕我直言)。 –

回答

1

服务器端的连接超时选项肯定存在,在客户端上,您可以尝试在firebird.conf中设置它 如何测试端口是否在连接之前打开?

<?php 

function con_test($i, $p) { 
    $f = @fsockopen($i, $p, $errno, $errstr, 0.1); 
     if (!$f) { 
      return false; 
     } 
     else { 
      fclose($f); 
      return true; 
     } 
} 


$host[] = ['ip'=>'192.168.52.97','port' => '3050', 'alias' => 'test']; 
$host[] = ['ip'=>'192.168.52.96','port' => '3050', 'alias' => 'test']; 

$username='sysdba'; 
$password = 'masterkey'; 

foreach ($host as $k=>$v) 
{ 
if (con_test($v['ip'],$v['port'])) { 

    $host = $v['ip'].'/'.$v['port'].':'.$v['alias']; 
    $dbh = ibase_connect($host, $username, $password); 
    $stmt = 'SELECT \'test\' as test FROM rdb$database'; 
    $sth = ibase_query($dbh, $stmt); 

    while ($row = ibase_fetch_object($sth)) { 
    echo $row->TEST, PHP_EOL; 
    } 
    ibase_free_result($sth); 
    ibase_close($dbh); 
} 
else { 
    echo 'Cannot connect to '.$v['ip'].':'.$v['port'].PHP_EOL; 
}           

}