3

我用 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

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

如果您不希望您的 PHP 程序在您的公司 DC 之一失败的情况下等待 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 分布在很远的地方。

这样,如果当前至少有一个 DC 处于活动状态,您的 PHP 程序将始终具有高可用性。

于 2014-09-04T11:03:18.833 回答
0

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

尝试将 LDAP_OPT_REFERRALS 设置为 0

于 2012-03-30T13:10:37.040 回答
-1

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

于 2011-12-07T13:12:44.443 回答