我目前正在实施LDAP身份验证。如果LDAP服务器脱机,我会将凭据缓存为后备。作为此缓存的一部分,我需要检查我的LDAP服务器是否在线。与使用PHP的Ldap方法不同,最好使用类似ping的简单方法。
请注意,它应该能够处理任何协议。例如,我无法使用fsockopen
,因为它不支持ldaps://
。 [我知道我可以注册自己的协议包装]。
我希望这项检查通用且简单。
答案 0 :(得分:1)
我正在使用fsockopen
来达到这个目的。它是否支持ldaps
并不重要,因为最终有两种可能性:
你可以这样检查:
$fp = @fsockopen($host, $port, $errno, $errstr, 30);
if (! $fp) {
// Port is unavailable
}
fclose($fp);
现在您知道,要连接的端口已打开,我可以启动LDAP。
我发现了两个边缘情况,但是你无法使用这种方法检查
您可以使用
检查$con = ldap_connect($ldapURI);
if (! ldap_bind($con, $user, $password)) {
// Something is fishy
}
Fishy可能是无效的凭据(在第一次绑定时不应该发生,对吧?)或者监听该端口的服务器没有以我们期望的方式响应。所以它不是LDAP服务器,或者服务器处于未定义状态。
要快速失败,你应该适当调整超时,这样你就不会等半分钟就知道出了什么问题。
你可以使用第五个参数设置fsockopen
的超时时间,你可以使用
ldap_set_option($con, LDAP_OPT_NETWORK_TIMEOUT, [whatever is appropriate]);
ldap_set_option($con, LDAP_OPT_TIMEOUT, [whatever is appropriate]);
ldap_set_option($con, LDAP_OPT_TIMELIMIT, [whatever is appropriate]);
// Only available when your LDAP-extension is compiled against the Netscape LDAP C-SDK
ldap_set_option($con, LDAP_X_OPT_CONNECT_TIMEOUT, [whatever is appropriate]);
您需要在 ldap_connect
后设置,然后 ldap_bind
之前设置。
LDAP_OPT_TIMEOUT和LDAP_X_OPT_CONNECT_TIMEOUT尚未在php.net上记录!
有关这些常量的更多信息,请查看https://linux.die.net/man/3/ldap_set_option,但请注意,并非所有提到的常量都在PHP-LDAP-Extension中实现。