Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP fsockopen ldap域搜索_Php_Ldap_Fsockopen - Fatal编程技术网

PHP fsockopen ldap域搜索

PHP fsockopen ldap域搜索,php,ldap,fsockopen,Php,Ldap,Fsockopen,上下文: 我正在使用域名地址尝试检查与域控制器的连接,但并非所有域控制器都可以从运行PHP的服务器访问。因此,我使用一个循环来查看是否有域控制器使用fsockopen进行响应 Domain.ad指向15个可能的域控制器。server.domain.ad、server2.domain.ad等 ... $i = 0; do { $fp = fsockopen("domain.ad", 389, $errno, $errstr, 1); $i++; } while(!$fp &

上下文:
我正在使用域名地址尝试检查与域控制器的连接,但并非所有域控制器都可以从运行PHP的服务器访问。因此,我使用一个循环来查看是否有域控制器使用fsockopen进行响应

Domain.ad指向15个可能的域控制器。server.domain.ad、server2.domain.ad等

...
$i = 0;
do
{
    $fp = fsockopen("domain.ad", 389, $errno, $errstr, 1);
    $i++;
}
while(!$fp && $i < 15);
...
//$ip = $fp->getAddress(); or something like that.
。。。
$i=0;
做
{
$fp=fsockopen(“domain.ad”,389,$errno,$errstr,1);
$i++;
}
而(!$fp&&$i<15);
...
//$ip=$fp->getAddress();或者类似的。
问题:

有没有办法从fsockopen连接中找到它成功连接的IP地址/域控制器,以便稍后在代码中使用以完成LDAP绑定?或者,有没有更好的方法不用使用1个域控制器就可以做到这一点?

我不确定您在那里想要实现什么
fsockopen
尝试在给定端口上打开与给定服务器的连接。您还设置了一个超时。但这是一个循环。因此,您尝试连续15次打开连接,并在每次运行时将服务器超时时间增加1秒。但据我所知,有多个域控制器可用。根据网络设置的不同,第一个可用的端点应该会做出反应并充当“您的”端点。作为该系统的用户,您不需要检查哪些可以访问,哪些不能访问。当您执行
ldap\u连接时,您应该得到一个句柄ldap://domain.ad:389);

或者,您可以通过
gethostbyname('domain.ad')
对域控制器执行DNS查询,该查询将为您提供给定主机的IP地址。但正如我所说,当你的网络得到适当维护时,就不需要这样做了

当您有多个服务器名时,您可以在空格分隔的列表中使用它们作为
ldap\u connect
的参数,如下所示:

ldap_connect('ldap://domain.ad:389 ldap://domain2.ad:389 ldaps://domain.ad:123');
应该连接到第一个可用的服务器


不过,您必须注意一个问题:
ldap\u connect
doesnotconnect!连接通常首先在
ldap\u bind
上打开!因此连接问题将不会出现在
ldap\u connect
上。如果您在那里得到一个
false
,这仅仅意味着提供的参数不符合预期!这就是为什么我通常首先使用
fsockopen
检查服务器是否可用的原因,如果这是一个问题,那么我可以快速失败。

我的迭代域控制器的解决方案

$ipDomain = dns_get_record("domain.ad", DNS_A);
$i = 0;
do
{
    $fp = fsockopen($ipDomain[$i]['ip'], 389, $errno, $errstr, 1);
    if(!$fp)
    {
        $i++;
        if($i >= sizeof($ipDomain))
        {
            break;
            //die();
        }
    }
}
while(!$fp);
...
ldap_connect($ipDomain[$i]['ip']);
...

“domain.ad”是否有15条CNAME或15条A记录?DNS应该只返回那些可以从您的计算机访问的服务器。或者做一个DNS查询来找到所有的a记录,并在上面循环找到一个可访问的记录。这实际上是我昨天下午做的。