检查服务器是否在线

时间:2016-12-10 12:44:07

标签: php ldap

我目前正在实施LDAP身份验证。如果LDAP服务器脱机,我会将凭据缓存为后备。作为此缓存的一部分,我需要检查我的LDAP服务器是否在线。与使用PHP的Ldap方法不同,最好使用类似ping的简单方法。

请注意,它应该能够处理任何协议。例如,我无法使用fsockopen,因为它不支持ldaps://。 [我知道我可以注册自己的协议包装]。

我希望这项检查通用且简单。

1 个答案:

答案 0 :(得分:1)

我正在使用fsockopen来达到这个目的。它是否支持ldaps并不重要,因为最终有两种可能性:

  • 相应的端口已打开,因此我可以假设LDAP服务器已启动并正在运行或
  • 相应的端口打开,因此我可以假设LDAP-Server 正在运行。

你可以这样检查:

$fp = @fsockopen($host, $port, $errno, $errstr, 30);
if (! $fp) {
    // Port is unavailable
}
fclose($fp);

现在您知道,要连接的端口已打开,我可以启动LDAP。

我发现了两个边缘情况,但是你无法使用这种方法检查

  • LDAP-Server处于未定义状态,端口仍处于打开状态但未响应或
  • 其他一些应用程序已打开端口。

您可以使用

检查
$con = ldap_connect($ldapURI);
if (! ldap_bind($con, $user, $password)) {
    // Something is fishy
}

Fishy可能是无效的凭据(在第一次绑定时不应该发生,对吧?)或者监听该端口的服务器没有以我们期望的方式响应。所以它不是LDAP服务器,或者服务器处于未定义状态。

要快速失败,你应该适当调整超时,这样你就不会等半分钟就知道出了什么问题。

你可以使用第五个参数设置fsockopen的超时时间,你可以使用

设置LDAP的超时时间
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中实现。