PHP -从ldap_connect()捕获超时异常



我用PHP编写了一个小的监视脚本,它应该监视一个虚拟目录和它的活动目录。一切工作正常,但当虚拟目录服务冻结是我的ldap_connect()无法连接,但也没有得到一个错误回来。所以我的整个剧本停滞不前。我认为ldap_connect函数得到一个超时返回(就像当你试图ping一个IP,它是不可达的)。

这是我的连接命令:

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

并且我没有在ldap_connect() (manual)的手册中找到关于时间限制参数的东西,在该参数中您可以定义函数应该尝试连接多长时间,直到它终止。

无论如何,我都不能用trycatch或类似的东西想出一个解决方案。我也不想使用set_time_limit()函数,因为我的脚本需要运行到最后。

谢谢你的帮助:)谢谢大家蒂姆。

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

指定以下选项:-

LDAP_OPT_NETWORK_TIMEOUT
LDAP_OPT_TIMELIMIT

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

try set LDAP_OPT_REFERRALS in 0

如果你不想让你的PHP程序等待XXX秒才放弃,当你的一个公司的DC失败的情况下,
并且由于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分布在遥远的地方。

如果当前至少有一个DC是活动的,那么您的PHP程序将始终具有高可用性。

您需要使用支持超时的API。LDAP(协议)不以本地方式支持连接超时。timelimit是客户端请求的参数,它指的是目录处理搜索请求所需的时间,与"连接超时"不同。

相关内容

  • 没有找到相关文章

最新更新