2017-07-31 15 views
3

ファイアバード2.5dbに接続しているときにタイムアウトを実装しようとしています。ibase_connectをタイムアウトするには?

これは、150以上のサーバーに接続するためのスクリプトです。スクリプトの実行時間を維持するために、私の目標はサーバーと次のスクリプトに移動するにはあまりにも失敗します。

通常のスクリプトの実行時間は30秒ですが、1台のサーバに障害が発生すると最大300秒になります。 PHP 7でibase拡張機能を使用しています。

アドバイスはありますか?

ありがとうございます。

+0

が財産 'isc_dpb_connect_timeout'がありますが、1)私はあなたがibase_connect''でそれを設定することができますかわからない、と2)IIRCそれだけに接続した後、発効サーバーに接続する前に、データベースに接続する(どのような目的でIMHOを使用できないか)。 –

答えて

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

}

関連する問題