Если вы не хотите, чтобы ваша 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, распределенных по отдаленным местам.
Таким образом, ваша PHP-программа всегда будет иметь высокую доступность, если в настоящее время активен хотя бы один DC.