3

PHPで小さな監視スクリプトを作成しました。このスクリプトは、仮想ディレクトリとそのActiveDirectoryを監視する必要があります。すべて正常に動作しますが、仮想ディレクトリサービスがフリーズすると、ldap_connect()が接続できなくなりますが、エラーも返されません。だから私のスクリプト全体は静止しています。ldap_connect関数はタイムアウトを取り戻すと思います(IPにpingを実行しようとして、到達できない場合など)。

それが私の接続コマンドです:

$connection = ldap_connect($hostname, $port) or die("Could not connect to {$hostname});

また、ldap_connect()(manual)のマニュアルには、関数が異常終了するまでの接続を試行する時間を定義できるtimelimitパラメーターに関する情報が見つかりませんでした。

しかし、私はこのような解決策tryを思いつくことができませんでした。また、スクリプトを最後まで実行する必要があるため、この関数catchを使用したくありませんでした。set_time_limit()

私はすべての助けに感謝します:)ありがとうと挨拶ティム

4

4 に答える 4

4

http://www.php.net/manual/en/function.ldap-set-option.php

特に次のオプション:-

LDAP_OPT_NETWORK_TIMEOUT
LDAP_OPT_TIMELIMIT
于 2011-12-07T12:19:28.417 に答える
0

http://www.php.net/manual/en/function.ldap-set-option.php

LDAP_OPT_REFERRALSを0に設定してみてください

于 2012-03-30T13:10:37.040 に答える
0

企業のDCの1つに障害が発生した場合に、PHPプログラムをあきらめる前にXXX秒待機させたくない場合、
およびldap_connect()ユーザーが指定した時間にタイムアウトするメカニズムがないため、

これは私の回避策であり、優れた実用的な結果を示しています。

function serviceping($host, $port=389, $timeout=1)
{
   $op = fsockopen($host, $port, $errno, $errstr, $timeout);
   if (!$op) return 0; //DC is N/A
   else {
      fclose($op); //explicitly close open socket connection
      return 1; //DC is up & running, we can safely connect with ldap_connect
   }
}

// ##### STATIC DC LIST, if your DNS round robin is not setup
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');

// ##### DYNAMIC DC LIST, reverse DNS lookup sorted by round-robin result
$dclist = gethostbynamel('domain.name');

foreach ($dclist as $k => $dc) if (serviceping($dc) == true) break; else $dc = 0;
//after this loop, either there will be at least one DC which is available at present, or $dc would return bool false while the next line stops program from further execution

if (!$dc) exit("NO DOMAIN CONTROLLERS AVAILABLE AT PRESENT, PLEASE TRY AGAIN LATER!"); //user being notified


//now, ldap_connect would certainly connect succesfully to DC tested previously and no timeout will occur
$ldapconn = ldap_connect($dc) or die("DC N/A, PLEASE TRY AGAIN LATER.");

また、このアプローチを使用すると、非常に優れたフェイルオーバー機能を利用できます。

例として、数十のDC-aが離れた場所に分散している会社を考えてみましょう。

このようにして、現在少なくとも1つのDCがアクティブになっている場合、PHPプログラムの可用性は常に高くなります。

于 2014-09-04T11:03:18.833 に答える
-1

タイムアウトをサポートするAPIを使用する必要があります。接続のタイムアウトは、LDAP(プロトコル)ではネイティブな方法ではサポートされていません。これtimelimitは、ディレクトリが検索要求の処理に費やす時間を参照するクライアント要求パラメータであり、「接続タイムアウト」と同じではありません。

于 2011-12-07T13:12:44.443 に答える