2015-12-07 4 views
1

Итак, я пытаюсь выполнить поиск по имени пользователя с помощью PHP и LDAP. Однако есть несколько серверов и несколько доменов. Я понял, как заставить логин работать плавно, насколько я проверял, по крайней мере. Однако функция поиска немного сложнее.Поиск LDAP нескольких серверов и доменов (PHP)

 $Servers = $LDAP['LDAPSrvs']; 
     $Domains = $LDAP['LDAPDoms']; 

     $sLoop = 0; 
     $dLoop = 0; 

     foreach($Servers as $Server) 
     { 
      $sLoop++; 

      $connect = 'ldap://'.$Server; 
      $lcon = ldap_connect($connect); 

      ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3); 
      ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1); 

      $bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']); 

      if($bind) 
      { 
       $search = ldap_search($lcon, $DN, "(sAMAccountName=$username)"); 

       if($search) 
       { 
        $info = ldap_get_entries($lcon, $search); 
        echo var_export($info); 
        if(count($info) >= 1) 
         break; 
       } else { 
        new MessageHandler('No users were found.', 'INFO'); 
       } 
      } 
      else 
      { 
       new MessageHandler('Something went wrong.', 'ERR'); 
      } 
     } 
     @ldap_close($lcon); 

Код, который я использую для поиска. Тем не менее, это дает большую задержку, и даже ошибка в сервере/DN не обнаружила пользователя с этим именем пользователя.

У меня очень ограниченный опыт работы с LDAP и PHP, поэтому я бы не знал, как это решить сам. Я всегда решаю вещи, пытаясь и терпя неудачу, поэтому в конце концов я могу найти хак, который работает. Однако, если кто-нибудь может мне помочь, объяснив мне, как это можно сделать, было бы очень полезно!

ответ

0

Вы можете использовать ldap_count_entries(), чтобы получить быстрый ответ с сервера, чтобы узнать, что-то было найдено вообще. Это может быть быстрее, чем сначала получить результат поиска и увидеть, что там ничего нет.

Так может выглядеть примерно так:

foreach($Servers as $Server) { 
    $sLoop++; 

    $connect = 'ldap://'.$Server; 
    $lcon = ldap_connect($connect); 

    ldap_set_option($lcon, LDAP_OPT_PROTOCOL_VERSION, 3); 
    ldap_set_option($lcon, LDAP_OPT_NETWORK_TIMEOUT, 1); 
    ldap_set_option($lcon, LDAP_OPT_REFERRALS, 0); 

    $bind = ldap_bind($lcon, $LDAP['LDAPUser'], $LDAP['LDAPPass']); 

    if(! $bind) { 
     new MessageHandler('Something went wrong.', 'ERR'); 
     continue; 
    } 

    $search = ldap_search($lcon, $DN, "(sAMAccountName=$username)"); 

    if (ldap_count_entries($lcon, $search) < 1) { 
     new MessageHandler('No Users found.', 'ERR'); 
     continue; 
    } 

    $info = ldap_get_entries($lcon, $search); 
    echo var_export($info); 

    @ldap_close($lcon); 
} 

я не уверен, однако, что он ускоряет много.

Вы также можете добавить что-то вроде echo microtime(); где-нибудь в цикле, чтобы увидеть, реагируют ли некоторые серверы на более медленные, чем другие.

+0

Благодарим вас за ответ! Я проверю его и вернусь сюда с результатами. – Nozemi

+0

Я отредактировал ваш ответ, установил LDAP_OPT_REFERRALS равным 0. Это сделало его поиск мгновенно. – Nozemi

+0

Это был бы следующий вопрос, относятся ли LDAP-серверы к внешним серверам. В этом случае настройка LDAP_OPT_REFERRALS, чтобы не следовать им, ускорит поиск вверх - ради того, чтобы не искать полный каталог. Это зависит от вашей настройки, хорошо ли это или нет. – heiglandreas

Смежные вопросы