2017-07-31 1 views
3

J'essaye d'implémenter un timeout en me connectant à un firebird 2.5 db.Comment temporiser ibase_connect?

Ceci est pour un script qui se connecte à plus de 150 serveurs. Mon but est aussi d'échouer ce serveur et passer au suivant, afin de maintenir le temps d'exécution du script.

Le temps d'exécution normal du script est de 30 secondes, mais si un serveur tombe en panne, il peut atteindre 300 secondes. J'utilise l'extension ibase sur PHP 7.

Des conseils?

Merci d'avance.

+0

Il y a une propriété 'isc_dpb_connect_timeout', mais 1) Je ne sais pas comment vous pouvez le configurer avec' ibase_connect', et 2) IIRC il vient seulement en vigueur après la connexion au serveur mais avant de joindre à la base de données (quel type de défaites le but à mon humble avis). –

Répondre

1

L'option timeout de connexion existe bien sur le côté serveur, sur le client, vous pouvez essayer de le définir dans firebird.conf Que diriez-vous de tester si le port est ouvert avant de vous connecter?

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

}