2017-07-31 28 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; 
}           

}