PHP - поймать исключение тайм-аута из ldap_connect () - PullRequest
2 голосов
/ 07 декабря 2011

Я написал небольшой скрипт мониторинга на PHP, который должен отслеживать виртуальный каталог и его активные каталоги. Все работает нормально, но когда служба виртуальных каталогов зависает, мой ldap_connect () не может подключиться, но также не возвращает ошибку. Так что весь мой сценарий стоит на месте. Я думаю, что функция ldap_connect возвращает тайм-аут (например, когда вы пытаетесь пропинговать IP, а он недоступен).

Это моя команда подключения:

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

И я не нашел в руководстве что-то для ldap_connect () ( manual ) о параметре timelimit, в котором вы можете определить, как долго функция должна пытаться соединиться, пока не прервется.

Как бы то ни было, я не совсем смог придумать решение с try и catch или что-то вроде этого. Я также не хотел использовать функцию set_time_limit(), потому что мой скрипт должен выполняться до конца.

Я ценю любую помощь :) Спасибо и привет Тим

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011

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

В частности, следующие опции: -

LDAP_OPT_NETWORK_TIMEOUT
LDAP_OPT_TIMELIMIT
0 голосов
/ 04 сентября 2014

Если вы не хотите, чтобы ваша 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.

0 голосов
/ 30 марта 2012

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

попробуйте установить LDAP_OPT_REFERRALS в 0

0 голосов
/ 07 декабря 2011

Вам нужно будет использовать API, который поддерживает тайм-ауты. Тайм-ауты соединения не поддерживаются LDAP (протокол). timelimit - это запрашиваемый клиентом параметр, который указывает, сколько времени каталог потратит на обработку поискового запроса, и не совпадает с «тайм-аутом соединения».

...