PHP - 来自ldap_connect()的捕获超时异常

时间:2011-12-07 12:07:44

标签: php timeout ldap ldapconnection

我在PHP中编写了一个监控脚本,它应该监视虚拟目录及其活动目录。一切正常,但当虚拟目录服务冻结时,我的ldap_connect()无法连接,但也没有收到错误。所以我的整个剧本静止不动。我认为ldap_connect函数会返回超时(就像当你尝试ping IP并且无法访问时)。

这是我的连接命令:

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

我还没有在ldap_connect()(manual)的手册中找到关于timelimit参数的内容,在该参数中你可以定义函数在中止之前应尝试连接多长时间。

我怎么也不能用trycatch或类似的东西来提出解决方案。我也不想使用set_time_limit()函数,因为我的脚本需要运行到最后。

我感谢每一个帮助:) 谢谢和问候 添

4 个答案:

答案 0 :(得分:3)

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

特别是以下选项: -

LDAP_OPT_NETWORK_TIMEOUT
LDAP_OPT_TIMELIMIT

答案 1 :(得分:0)

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

尝试在0

中设置LDAP_OPT_REFERRALS

答案 2 :(得分: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程序将始终具有高可用性。

答案 3 :(得分:-1)

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